アナクロンが私の任務を遂行している間、その子供を殺しました。

アナクロンが私の任務を遂行している間、その子供を殺しました。

anacron1 日に 1 回バックアップを実行するタスクを設定したい (Ubuntu 20.04.3 LTS). GUIをbackintime使用してこのタスクをスケジュールした場合は、backintime一般的な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

これがbackintimecrontabに追加されたものなので、使用すると正しく機能すると確信しています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などの一部のワーカープロセスを分離し、一度「終了」するとバックグラウンドで再実行される唯一のタスクであるため、すぐに終了します. start サーバーが終了します。これまでは問題ありませんでしたが、anacronスクリプトが完了したら、元のバックアップスクリプトのすべての子孫を終了するのは責任だと思います。しかし、どうすればこのようなことを防ぐことができますか?バックアップスクリプトを終了する前に子PIDを手動で見つけ、すべてのPIDが完了するのを待つ必要がありますか?

オンラインでこの動作に関する情報が見つかりませんでしたので、ここで何をすべきかを提案している人がいる場合は、喜んでお知らせします。

ベストアンサー1

編集:以下の解決策は100%有効ではなかったため、再調査したところ、根本的な原因がanacron自体ではなくシステム構成にあることがわかりました。明らかに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"

これは最もエレガントな解決策ではないかもしれませんが、少なくともうまくいきます。

おすすめ記事