停電または再起動前にスクリプトを実行する

停電または再起動前にスクリプトを実行する

私は過去2週間この問題に直面してきました。私は生涯にわたってそれを動作させる方法を見つけることができません。

状態

私はいくつかのVirtualBox仮想マシンがあるDebian 9サーバーを実行しています。電源が切れてサーバーがシャットダウンしたときに「状態を保存」したいと思います。サーバーが再起動したら、これらのVMを再起動したいと思います。

仮想マシンを保存して起動するスクリプトは非常にスムーズに実行されました。問題ありません。起動後の起動部分も良いです。問題は閉じる部分にあります。だから内容を少し単純化しました。

残りの質問

/home/vorkbaard/goingdown.sh スクリプトがあります。サーバーがすぐに終了するという内容のメールを私に送信します。スクリプトはうまくいきます。しかし、停電中に実行を開始しましたが、完了する前にネットワークの中断によって中断されました。

私が望むもの電源を切ったり、再起動コマンドを実行した後、ネットワークやファイルシステムのシャットダウンなどの他のタスクが開始される前にスクリプトを実行します。このプロセスを実行するには、スクリプトが正常に完了するまで待つ必要があります。

頑張ったSystemdとSysVを使用していますが、SysVに非常に精通していますが、もはや自分の実行順序を選択することはできません。 Systemdが置き換えているので、とにかくSysVがDebianで段階的に廃止されているので、Systemdに完全に切り替えたいと思います。 。 DevuanやRHELに切り替えるのではなく、Debianを使い続けたいです。

ユニットファイルを作成して正しい場所に移動することが正しい方法であることはわかっていますが、前述したように、生涯にわたってこれを行う正しい方法はわかりません。数多くの例がありますが、私の状況に合った例は一つもないようです。

実際の問題

どのユニットファイルを作成し、どこに置く必要があり、再起動または電源を切った後にサーバーに最初にファイルを実行するかをどのように指示できますか?


適応してみてください終了して再起動する前に、単純なスクリプトを実行してください。:

/etc/systemd/system/test.serviceから:

[Unit]
Description=Send an email on shutdown and reboot

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

それから再起動してsystemctl status test.serviceやりましたactive (exited)。ただし、再起動するとA stop job is running for Send an e...utdown and reb oot (34s / 1min 30s)_1.5分後にタイムアウトし、メールが送信されず、サーバーが再起動するというメッセージが表示されます。

/var/log/syslog説明する:

Stopping Send an email on shutdown and reboot...
Creating SSL connection to host
SSL connection using RSA_AES_128_CBC_SHA1
Sent mail for [my email address here] (221. 2.0.0 closing connection q45sm79107etc.53 - gsmtp) uid=0 username=root outbytes=509
Stopped Send an email on shutdown and reboot

ところでメールが送信されず、メールキューにメールもありませんでした。私がメールを送信しているアカウントにもエラーはありません。繰り返しますが、スクリプトは手動で実行すると正常に動作します。

/root/rebootscriptです:

/bin/bash
NOW=$(/bin/date +"%H:%M")
/bin/echo "Rebooting $NOW" | /usr/bin/mailx -s "Rebooting $NOW" [my email address here]

不思議なことに、これを行うと、systemctl stop test.serviceサーバーが再起動されるというメールが来るので、サービス自体はうまくいくようです。

ベストアンサー1

わかりました、わかりました。元々アップロードしたスクリプトは大丈夫でしたが、ネットワーク障害が発生した後に実行されてメールが送信されない理由が説明になります。

詳細:https://serverfault.com/questions/785127/how-to-stop-systemd-services-in-specific-order

働くスクリプト:

[Unit]
Description=Send an email on shutdown and reboot
Wants=network-online.target   <---- ADDED THIS
After=network-online.target   <----/

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

上記のファイルは多すぎるかもしれませんが、確かに動作します。

みんなありがとうございます:)

おすすめ記事