同じスクリプトでエラーが発生した場合は、そのスクリプトを実行しているcronジョブをキャンセルします。

同じスクリプトでエラーが発生した場合は、そのスクリプトを実行しているcronジョブをキャンセルします。

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

しかし、これは原則を妥協し、クローン作業をもはや実際にはクローン作業ではないようにします。

関連情報