Ubuntu

Anacron 殺死了我任務的孩子

  • March 23, 2022

我想設置一個anacron任務來backintime每天執行一次備份(Ubuntu 20.04.3 LTS)。如果您使用backintimeGUI 安排此操作,則會使用正常的 crontab,但對於我的案例,這不合適:我通常在不使用電腦時讓電腦處於待機狀態,因此如果我不使用,則會丟棄 cronjob ‘沒有讓電腦在那個確切的預定時間執行。我所做的是在cron.daily目錄中創建一個腳本,以便anacron處理它,它還支持在待機或電腦關閉一段時間的情況下延遲執行。我添加了以下命令:

sudo -i -u samuel /usr/bin/nice -n19 /usr/bin/ionice -c2 -n7 /usr/bin/backintime backup-job >/dev/null

這正是backintime添加到 crontab 的內容,所以我確信它在使用anacron. 但事實並非如此:工作開始得很好,但備份永遠不會完成。系統日誌輸出如下:

backintime (samuel/1): INFO: Lock
backintime (samuel/1): WARNING: Inhibit Suspend failed.
backintime (samuel/1): INFO: mount ssh: [...]
backintime (samuel/1): INFO: Take a new snapshot. Profile: 1 Main profile
backintime (samuel/1): INFO: Call rsync to take the snapshot

[... around 10 seconds later ...]

anacron[1082]: Job `cron.daily' terminated (mailing output)
anacron[1082]: anacron: Can't find sendmail at /usr/sbin/sendmail, not mailing output
anacron[1082]: Can't find sendmail at /usr/sbin/sendmail, not mailing output
systemd[1]: anacron.service: Killing process 7920 (python3) with signal SIGKILL.
anacron[1082]: Normal exit (1 job run)
systemd[1]: anacron.service: Killing process 7958 (ssh-agent) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8107 (ssh) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8109 (sshfs) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8112 (python3) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8126 (rsync) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8127 (ssh) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8123 (QXcbEventQueue) with signal SIGKILL.
systemd[1]: anacron.service: Succeeded.

我覺得這種情況很奇怪,因為為什麼 anacron 會故意殺死我的程序?因此,據我的解釋,我在備份腳本中執行的命令退出得相當快,因為它的唯一任務是剝離一些工作程序,如 python、ssh、rsync 等,並且一旦它們重新在後台執行,啟動器退出。到目前為止一切都很好,但anacron顯然認為一旦腳本完成,就必須殺死原始備份腳本的所有後代。但是我怎樣才能阻止它這樣做呢?在退出備份腳本之前,我真的需要手動找出後代 PID 並等待它們全部完成嗎?

我沒有在網上找到任何關於這種行為的資訊,所以如果有人對如何在此處進行操作有任何建議,我會很高興。

編輯:下面的解決方法在 100% 的情況下都不起作用,所以我再次探勘並確定根本原因不是 anacron 本身,而是它的 systemd 配置:顯然 systemd 單元可以指定用於清理的終止模式一旦主程序完成,任何衍生的子程序。Anacron 將此設置為“混合”,並將其更改為“無”成功允許我的備份任務在後台執行。請注意,對於其他類型的 anacron 任務,禁用殺死子程序可能並不理想,但對於我的案例來說,這正是我所需要的。

可以通過sudo systemctl edit anacron.service然後輸入以下配置來更改殺死模式:

[Service]
KillMode=none

我將保留以前的解決方法以供參考:

對於這種情況,我發現了一個或多或少的強大解決方法:在我的具體情況下,backintime通過 SSH 進行遠端備份。這是通過啟動一個sshfs程序來完成的,該程序負責安裝備份位置並在備份完成後退出。因此,腳本可以等待該過程再次開始和完成,以便知道備份何時完成:

sudo -i -u samuel /usr/bin/nice -n19 /usr/bin/ionice -c2 -n7 /usr/bin/backintime backup-job >/dev/null

echo "Waiting for SSHFS to start"
until pids=$(pidof sshfs)
do
   sleep 1
done

echo "Waiting for backup to finish (SSHFS [$pids] to exit)"
while ps -p "$pids" >/dev/null 2>&1
do
   sleep 5
done

echo "SSHFS process gone, exiting"

這可能不是最優雅的解決方案,但至少效果很好。

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