シャットダウンする前に、pfsenseルーターを正常にシャットダウンするようにLinuxボックス(UPSに接続)を設定しています。私はUbuntu 16.04を実行しており、systemdを使用してこれを行っています。 systemdサービスを設定しましたが機能します。ただし、終了して再起動するとスクリプトが起動します。 Linuxボックスを再起動するたびにルーターをシャットダウンするため、これはお勧めできません。システムサービスがシャットダウン中にのみ有効になるようにどのように変更しますか?
私の設定は次のとおりです。
[Unit]
Description=PFSense Shutdown script
After=poweroff.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/path/to/script/pfsenseshutdown.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
ちなみに、pfenseshutdown.shスクリプトは非常に簡単です。
#!/bin/bash
ssh [email protected] -i "sudo /etc/rc.halt"
どんな助けでも大変感謝します。
ベストアンサー1
次の方法は、再起動時ではなく終了時にのみスクリプトを実行するようです。systemd-poweroff.service
次のようにファイルを編集できます。
sudo systemctl edit --full systemd-poweroff.service
この[Service]
セクションでは、次の行を追加できますExecStartPre
。
ExecStartPre=/path/to/script/pfsenseshutdown.sh
これにより、しかしを使用してシステムをシャットダウンすると、スクリプトは実行されませんhalt
。この状況を処理するには、同じ行をsystemd-halt.service
。
このアプローチでは、質問に示されている構成ファイルは使用されません。
編集する:以前のアプローチの1つの可能性のある欠点は、実行されるスクリプトにssh
システムをシャットダウンする前に正しく機能しない可能性があるコマンドが含まれていることです(systemdが必要なネットワークサービスを停止した可能性があります)。次の方法は、このような状況を防ぐためのものです。
pfsenseshutdown.service
このソリューションでは、次の内容でセルを作成しました。
[Unit]
Description=PFSense Shutdown script
DefaultDedendencies=no
[Service]
Type=oneshot
ExecStart=/usr/bin/touch /dev/shm/shuttingdown
[Install]
WantedBy=systemd-halt.service systemd-poweroff.service
このファイルは、シャットダウンルーチンが起動するとすぐにこの行が実行され、ExecStart
ファイルが/dev/shm/shuttingdown
存在するように見えます(/dev/shm
ディレクトリはメモリ内のファイルシステムなので、再起動後に消去されます)。
これで、ネットワークが完全に初期化解除される前にスクリプトが実行されていることを確認するために、以下を実行しました。
systemctl edit --full networking.service
ExecStop
当初、私のUbuntu 16.04仮想マシンには次の行が含まれていました。
ExecStop=/sbin/ifdown -a --read-environment
この行は、次の例で最初にスクリプトを実行するバージョンに置き換えられました。
ExecStop=/path/to/script/pfsenseshutdown.sh && /sbin/ifdown -a --read-environment
その後、スクリプトはpfsenseshutdown.sh
ファイルが/dev/shm
存在するかどうかをテストし、それに応じてsshコマンドを実行します。また、多くのタスクを並列に実行するためにsystemdという小さなコマンドを追加しましたsleep
。これはファイルが存在しないため、テストが失敗するのを防ぐのに役立ちます。しかし、。
#!/bin/bash
sleep 1
if [ -e /dev/shm/shuttingdown ] ; then
# Your ssh command here
fi