我在哪裡可以安裝儘早執行 zsh 腳本的 systemd 服務
我想知道我在哪裡可以安裝這個執行 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
設置
DefaultDependencies
為no
允許您的服務在啟動過程的早期執行,但也要求您更明確地了解服務的要求。由於腳本在
/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/hooks
到update-initramfs
一個initramfs-tools 引導腳本(放置在其中一個/etc/initramfs-tools/scripts/*/
目錄中)。不過,我建議不要使用
zsh
shell 及其要求來膨脹 initramfs:如果你想使用 initramfs 路由,你應該首先讓你的啟動時腳本可以使用/bin/dash
(輕量級 POSIX shell)執行,因為這是預設 shell存在於現代 Debian/Ubuntu 的 initramfs 中。掛鉤腳本和引導腳本都有需要遵循的特定要求:
man 7 initramfs-tools
兩種類型的腳本都有範例。您還需要處理在 initramfs 期間所有設備可能尚未初始化的事實:
udev
將在載入核心模組時忙於創建設備。您的鉤子腳本必須確保您/dev/ttyS5
和您的 GPIO 的驅動程序將包含在 initramfs 中,並且您的引導腳本必須在嘗試使用設備之前顯式載入它們或檢查它們是否已自動載入。