bashスクリプトは終了時に開始されますが、再起動時には開始されません。

bashスクリプトは終了時に開始されますが、再起動時には開始されません。

シャットダウンする前に、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

おすすめ記事