在重新啟動電源關閉之前執行腳本
在過去的兩周里,我一直在把頭髮拉出來。我一生都無法弄清楚如何讓它發揮作用:
情況
我正在執行帶有幾個 VirtualBox 虛擬機的 Debian 9 伺服器,當伺服器關閉以重新啟動電源關閉時,我想“保存狀態”。伺服器重新啟動後,我希望這些虛擬機重新啟動。
保存然後啟動虛擬機的腳本就像一個魅力。那裡沒問題。啟動後啟動它們的部分也很好。問題在於關閉部分。所以我把事情簡化了一點。
剩下的問題
我有一個腳本:/home/vorkbaard/goingdown.sh。它向我自己發送一封電子郵件,說明伺服器正在關閉。該腳本工作正常。但是在斷電時它開始執行,但在完成之前由於網路中斷而中斷。
我想要的是在給出 poweroff 或 reboot 命令之後但在其他任何東西開始執行之前執行一個腳本,比如網路或文件系統出現故障。該過程需要等到腳本成功完成。
我嘗試使用 Systemd 和 SysV,但雖然我對 SysV 非常熟悉,但它不再讓我選擇自己的執行順序,我猜是因為 Systemd 正在替換 is,無論如何我想完全切換到 Systemd,因為 SysV 正在被淘汰在 Debian 中。我想繼續使用 Debian,而不是切換到 Devuan 或 RHEL。
我知道創建單元文件並將它們移動到正確的位置是要走的路,但正如我所說 - 我無法為我的生活找出正確的方法來做到這一點。有無數的例子,但似乎沒有一個特定於我的情況。
實際問題
我應該創建哪些單元文件,我應該把它們放在哪裡,以及如何告訴我的伺服器在重新啟動或關閉電源後先執行它們?
還嘗試在關機和重啟之前調整執行簡單腳本:
在 /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
收到一封郵件說伺服器正在重新啟動,那麼服務本身似乎可以工作。
好的,我想通了。我原始文章中的腳本沒問題,但它是在網路出現故障後執行的,這解釋了為什麼郵件沒有發送。
詳細資訊: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
上面的文件中可能有太多內容,但這絕對有效。
謝謝你們 :)