Systemd
為什麼 systemd 腳本在啟動時沒有產生預期的結果,但之後卻正確?
我在 Raspbian Stretch 上有一個 Raspberry Pi,我想在啟動時啟用一些 GPIO 引腳。
我寫了以下服務:
[Unit] Description=GPIO23 exported as output, value off [Service] Type=oneshot ExecStart=/bin/bash -c 'echo "23" > /sys/class/gpio/export' ExecStart=/bin/bash -c 'echo "out" > /sys/class/gpio/gpio23/direction' ExecStart=/bin/bash -c 'echo "0" > /sys/class/gpio/gpio23/value' StandardOutput=null [Install] Alias=gpio23.service
通過 SSH 登錄後,我檢查結果:
pi@Hi-Fi:~ $ systemctl status gpio23 ● gpio23.service - GPIO23 exported as output, value off Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled) Active: inactive (dead) pi@Hi-Fi:ls /sys/class/gpio/ export gpiochip0 unexport
由於它尚未執行(或未按預期工作),我手動啟動該服務:
pi@Hi-Fi:~ $ sudo systemctl start gpio23 [sudo] password for pi: pi@Hi-Fi:~ $ systemctl status gpio23 ● gpio23.service - GPIO23 exported as output, value off Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled) Active: inactive (dead) Jan 01 19:31:12 Hi-Fi systemd[1]: Starting GPIO23 exported as output, value off... Jan 01 19:31:12 Hi-Fi systemd[1]: Started GPIO23 exported as output, value off. pi@Hi-Fi:~ $ ls /sys/class/gpio/ export gpio23 gpiochip0 unexport
現在它起作用了。
我怎樣才能讓它按預期立即工作?
[安裝] 別名=gpio23.service
就像注意到該部分中沒有
WantedBy
設置一樣簡單。您已經告訴 systemd 啟用該服務,但實際上並未描述啟用該服務時哪個目標應該需要它。標準輸出=空
將其作為日常練習是不明智的。讓標準輸出被記錄,直到它成為一個實際的問題(這顯然遠非幾個
echo
命令的情況)。ExecStart=/bin/bash …
同樣,除非您明確依賴 Bashisms,否則不要命名 Bourne Again shell,這(再次)您不只是使用一些
echo
命令。十年前,Debian 和 Ubuntu 的人們竭盡全力將 Bourne Again shell 從系統引導過程中移除,並用 Almquist shell 取而代之,後者在非互動模式下的初始化成本要小得多,這顯著加快了引導程序。到處閒逛
/bin/bash
——在 systemd 服務單元中也不少!— 而不是/bin/sh
, 取消了這項好工作。