5分ごとにcronが実行するスクリプトがあります。スクリプト自体でXYZエラーが発生した場合は、クローン操作を永久に停止し、スクリプトを終了するように追加したいと思います。現在のexit 1
スクリプトに1つだけ追加すると、エラーが発生した場合、cronはスクリプトを再起動してループを続行します。
答え1
残念ながら、クローン操作はこのユースケースをサポートしていません。解決策を提案する良い答えを受けました。ただし、これはsystemdなどの他のタスクスケジューラ/サービスマネージャではかなり簡単です。たとえば、root以外のユーザーの場合は、~/.config/systemd/user
サービスとタイマーを含むディレクトリを作成します。
mytask.service
[Unit]
Description=My Task
After=multi-user.target
[Service]
Type=simple
ExecStopPost=/bin/sh -c 'if [ "$$EXIT_STATUS" = 1 ]; then systemctl --user stop mytask.timer; fi'
ExecStart=/bin/myscript.sh
[Install]
WantedBy=multi-user.target
mytask.timer
[Unit]
Description=Run script every 60 seconds
[Timer]
Persistent=true
OnBootSec=120
OnUnitActiveSec=60 # run every 60 seconds
Unit=mytask.service
[Install]
WantedBy=timers.target
最後に、サービスとタイマーを起動します。
systemctl --user enable mytask.service
systemctl --user enable mytask.timer
systemctl --user start mytask.timer
systemctl --user start mytask.service
スクリプトが失敗した場合(終了コード= 1)、サービスはタイマーを無効にし、スクリプトは再実行されません。
答え2
「クローンジョブのキャンセル」概念的なミスを犯すところです。プロセスをキャンセルできます。つまり、クローンジョブを一度だけ実行できます。クローンジョブが実行されなくなるようにするには、次のように話します。「クローンジョブを無効にする」
残念ながら、方法は1つだけです。「クローンジョブを無効にする」:crontabを編集して。cron
読み取り専用と見なされる独自のcrontabに書き換えないでください。
だからあなたはあなたの仕事が欲しい「自分を無効にしてください」。これを行う方法は、専用の状態ファイルを管理し、スクリプトにゲートをインストールすることです。
例:yourtask
ゼロ以外の状態が返された場合は、エラーフラグをタッチして追加の実行を停止します。
@hourly [ -f yourtask_error ] || yourtask || touch yourtask_error
しかし、これは原則を妥協し、クローン作業をもはや実際にはクローン作業ではないようにします。