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

今大丈夫です。

すぐに期待どおりに機能させるにはどうすればよいですか?

答え1

[インストールする]
エイリアス=gpio23.service

WantedByそのセクションに設定がないことに気づくのと同じくらい簡単です。サービスを有効にするようにsystemdに指示しましたが、実際に有効にしたときにどのターゲットがサービスを要求するかを説明していません。

標準出力 = 空

これを毎日実践するのは賢明ではありません。実際の問題が発生するまで標準出力を記録してください(いくつかのコマンドの場合とは明らかに異なりますecho)。

ExecStart=/bin/bash ...

同様に、Bashismに明示的に依存して(再び)特定のコマンドを使用しない限り、Bourne Againシェルの名前を指定しないでくださいecho

10年前、DebianとUbuntuの人々はシステムブートプロセスからBourne Againシェルを削除し、それを非対話モードで初期化オーバーヘッドがはるかに少ないAlmquistシェルに置き換えるために多くの労力を費やしました。 。どこでも利用可能/bin/bash- システム化されたサービスデバイスでも利用可能! — 代わりに/bin/sh、この良いことを台無しにします。

関連情報