anacron
1 日に 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
これが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などの一部のワーカープロセスを分離し、一度「終了」するとバックグラウンドで再実行される唯一のタスクであるため、すぐに終了します. 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"
これは最もエレガントな解決策ではないかもしれませんが、少なくともうまくいきます。
答え2
プロセスをバックグラウンドで実行し、anacronや他のサービスユニットを変更しない方法は、systemd-run
ユーティリティを使用することです。デフォルトでは、クリーンで分離された実行環境でppid = 1と単純なサービスタイプを使用して、新しい.service単位でプログラムを実行します。
あなたの場合は、backintime
子プロセスが作成された後に終了するため、orオプションを指定または--service-type=forking
使用する必要があります。これらの方法の違いの詳細については、systemd-runおよびsystemd.serviceのマニュアルを参照してください。--scope
-r