Anacron 殺死了我任務的孩子
我想設置一個
anacron
任務來backintime
每天執行一次備份(Ubuntu 20.04.3 LTS)。如果您使用backintime
GUI 安排此操作,則會使用正常的 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"
這可能不是最優雅的解決方案,但至少效果很好。