当同一脚本出现错误时,取消运行该脚本的 cron 作业

当同一脚本出现错误时,取消运行该脚本的 cron 作业

我有一个由 cron 每 5 分钟运行一次的脚本。在脚本本身中,我想添加一点,如果遇到 XYZ 错误,请永久停止 cron 作业并退出脚本。目前,如果我只是exit 1在脚本中添加一个,当错误发生时,cron 将重新启动脚本并继续循环。

答案1

不幸的是,cron 作业不支持这个用例。您已经收到了提供解决方法的良好答复。然而,这在其他任务调度程序/服务管理器(例如 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

“取消 cron 作业”是你犯了概念性错误的地方。您可以取消一个进程,即只执行一次 cron 作业。如果您希望不再执行您的 cron 作业,请说“禁用 cron 作业”

不幸的是,只有一种方法可以“禁用 cron 作业”:通过编辑 crontab。cron永远不会在其自己的 crontab 上写回,该 crontab 被视为只读。

所以你希望你的工作“禁用自己”。做到这一点的方法是管理一个专用的状态文件,并在脚本中安装一扇门。

示例:如果yourtask返回非零状态,则触摸错误标志以停止进一步执行:

@hourly [ -f yourtask_error ] || yourtask || touch yourtask_error

然而,它损害了原则,并使 cron 作业不再是真正的 cron 作业。

相关内容