Debian

在重新啟動電源關閉之前執行腳本

  • February 5, 2018

在過去的兩周里,我一直在把頭髮拉出來。我一生都無法弄清楚如何讓它發揮作用:

情況

我正在執行帶有幾個 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

上面的文件中可能有太多內容,但這絕對有效。

謝謝你們 :)

引用自:https://unix.stackexchange.com/questions/421412