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
ピンに接続されたリレーを使用して電源をオフにします)。
さらに時間を費やした後、私が探していたことを正確に実行するはるかに簡単な解決策を見つけました。
- ディレクトリ
/etc/systemd/system/systemd-poweroff.service.d
がまだ存在しない場合は作成する - ディレクトリ
poweroff.conf
に新しいファイルを作成します:/etc/systemd/system/systemd-poweroff.service.d
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh
このアプローチでは、新しいサービスを追加する必要はない。