Raspberry PI / systemd: シャットダウン/電源オフ時にスクリプトを実行するが、再起動時には実行しない

Raspberry PI / systemd: シャットダウン/電源オフ時にスクリプトを実行するが、再起動時には実行しない

Raspberry PI(raspbianを実行)でスクリプトを実行する必要がありますシャットダウン/電源を切る、 しかし再起動時ではない

私の最初の試みは、サービスを次のように定義することでした。

[Unit]
Description=Power off service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh

[Install]
WantedBy=multi-user.target

これはうまくいきましたが、スクリプトは再起動時にも実行されていました。そこで、別のターゲットにインストールしてみました。

[Install]
WantedBy=shutdown.target halt.target

しかし、この変更後、スクリプトはまったく実行されなくなります。

シャットダウン時に実行されるアクションを定義する適切な方法は何ですか?

答え1

ネットで収集した情報によると、最善のオプションは、Conflicts=reboot.targetユニット ファイル ([Unit]セクション) に を含め、スクリプトで以下を実行することです。

systemctl list-jobs | egrep -q 'reboot.target.*start'

が開始するようにスケジュールされている場合はreboot.target、再起動します。そうでない場合は、再起動しません。コマンドが「成功」した場合、システムは再起動します。そうでない場合は、シャットダウンします。次のように使用できます。

if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
  echo Shutting down
fi

答え2

ダニエルの回答は、質問の問題を解決します。しかし、それはまだ私が必要としていたものではありませんでした。スクリプトが呼び出されるのが早すぎたため、できるだけ遅く実行する必要がありました(スクリプトは実際には、RPi のGPIOピンに接続されたリレーを使用して電源をオフにします)。

さらに時間を費やした後、私が探していたことを正確に実行するはるかに簡単な解決策を見つけました。

  1. ディレクトリ/etc/systemd/system/systemd-poweroff.service.dがまだ存在しない場合は作成する
  2. ディレクトリpoweroff.confに新しいファイルを作成します:/etc/systemd/system/systemd-poweroff.service.d
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh

このアプローチでは、新しいサービスを追加する必要はない。

関連情報