Systemd

為什麼 systemd 腳本在啟動時沒有產生預期的結果,但之後卻正確?

  • July 12, 2018

我在 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, 取消了這項好工作。

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