外观
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