Skip to content

cron 定时任务

编辑

bash
crontab -e            # 当前用户
crontab -l            # 查看
crontab -e -u nginx   # 指定用户

格式

分 时 日 月 周  命令
*/5 * * * *  /usr/local/bin/check.sh
0  3 * * *   /usr/local/bin/backup.sh
0  4 * * 0   /usr/local/bin/weekly.sh     # 周日

不确定表达式对不对,去 crontab.guru 贴一下。

几个容易翻车的点

PATH 很短。cron 里的 PATH 通常只有 /usr/bin:/bin,脚本里用到的命令写绝对路径,或者在 crontab 开头加一行:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

没有输出就没人知道它跑没跑。把日志落到文件:

*/5 * * * * /usr/local/bin/check.sh >> /var/log/check.log 2>&1

或者用 logger 写到 journal:

bash
logger "check.sh: something happened"

然后 journalctl -t check.sh 能看到。

百分号要转义。crontab 里 % 是换行的意思,date +%F 得写成 date +\%F

脚本要可执行chmod +x 忘了的话 cron 悄悄失败。

一个健康检查的模板

进程活着但功能卡死的服务,systemd 不会重启它,用 cron 轮询:

bash
#!/bin/bash
if ! curl -sf --max-time 10 http://127.0.0.1:20241/ready > /dev/null; then
    systemctl restart cloudflared
    logger "cloudflared unhealthy, restarted"
fi

*/5 * * * * 跑。curl -sf 里的 -f 让非 2xx 也算失败。

看 cron 有没有在跑

bash
systemctl status crond      # RHEL 系
systemctl status cron       # Debian 系
journalctl -u crond -n 50

个人笔记,写给未来忘事的自己。