Ubuntu

我在哪裡可以安裝儘早執行 zsh 腳本的 systemd 服務

  • December 28, 2021

我想知道我在哪裡可以安裝這個執行 zsh 腳本以盡快執行我的腳本的服務

腳本在 /dev/ttyS5 和 gpio 引腳上使用串列埠。

是否有比multi-user.target這更早的目標仍然可以執行 zsh 腳本?

[Unit]
Description=Acer projector control
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/zsh /usr/local/bin/ff.zsh -a acer
ExecStop=/usr/bin/zsh /usr/local/bin/ff.zsh -rb acer
RemainAfterExit=yes
Restart=on-failure
RestartSec=10s
TimeoutSec=5min

[Install]
WantedBy=multi-user.target

更新 2。

[Unit]
Description=Acer projector control
DefaultDependencies=no
After=local-fs.target
After=systemd-modules-load.service
Before=sysinit.target
ConditionPathExists=/dev/ttyS5
Before=shutdown.target
Conflicts=shutdown.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/zsh /usr/local/bin/ff.zsh -a acer
ExecStop=/usr/bin/zsh /usr/local/bin/ff.zsh -rb acer
Restart=on-failure
RestartSec=30s
TimeoutSec=5min

[Install]
WantedBy=sysinit.target

考慮到這一點時,您應該參考 中的圖表,該圖表描述了基於 - 的引導過程man 7 bootup的整體結構。systemd

您可以指定WantedBy=sysinit.target,但是您需要在該[Unit]部分中指定幾件事:

[Unit]
DefaultDependencies=no
After=local-fs.target
After=systemd-modules-load.service
Before=sysinit.target

也許還有

ConditionPathExists=/dev/ttyS5

設置DefaultDependenciesno允許您的服務在啟動過程的早期執行,但也要求您更明確地了解服務的要求。

由於腳本在/usr/local其中(可能是單獨的文件系統),因此您必須確保在嘗試執行腳本之前已安裝文件系統。這可以通過After=local-fs.target.

您還必須確保您/dev/ttyS5和您的 GPIO 的核心模組已載入,除非您的腳本正在主動載入它們。After=systemd-modules-load.service旨在實現這一目標,假設您已經使用/etc/modules-load.d/*.conf文件來指定適當的模組。您還可以執行systemctl list-units *.device,找到.device與您的和/或您的 GPIO(如果存在)對應的單元ttyS5,並將您的服務設置為執行After=它們。

如果事實證明您的腳本(或)無法正常執行Before=sysinit.target還為時過早,那麼您可以嘗試改用。zsh``WantedBy=basic.target``Before=basic.target


或者,如果“介於local-fs.target和”對您來說還不夠早,sysinit.target那麼您必須編寫一個initramfs-tools鉤子腳本(放置/etc/initramfs-tools/hooksupdate-initramfs一個initramfs-tools 引導腳本(放置在其中一個/etc/initramfs-tools/scripts/*/目錄中)。

不過,我建議不要使用zshshell 及其要求來膨脹 initramfs:如果你想使用 initramfs 路由,你應該首先讓你的啟動時腳本可以使用/bin/dash(輕量級 POSIX shell)執行,因為這是預設 shell存在於現代 Debian/Ubuntu 的 initramfs 中。

掛鉤腳本和引導腳本都有需要遵循的特定要求:man 7 initramfs-tools兩種類型的腳本都有範例。

您還需要處理在 initramfs 期間所有設備可能尚未初始化的事實:udev將在載入核心模組時忙於創建設備。您的鉤子腳本必須確保您/dev/ttyS5和您的 GPIO 的驅動程序將包含在 initramfs 中,並且您的引導腳本必須在嘗試使用設備之前顯式載入它們或檢查它們是否已自動載入。

引用自:https://unix.stackexchange.com/questions/681586