我有一个由 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 作业。