Linux:这啥命令?这台服务器我说了算-定时任务——“凌晨三点的活,为什么要我醒着干?”
第九章:定时任务——“凌晨三点的活,为什么要我醒着干?”
凌晨三点,服务器要备份;早上九点,要生成报表;每隔五分钟,还得巡检一次服务。
难道你要抱着电脑熬夜?不,Linux 有自己的闹钟——cron。
本章以 Ubuntu/Debian 为例。学完你能让脚本定时运行,还能查出它为什么“到点装睡”。
1. 先认识两位主角
cron:后台定时调度服务,负责盯时间。crontab:用来编排个人定时任务的工具。
先检查:
systemctl status cron
crontab -l
如果没有安装(Ubuntu/Debian):
sudo apt update
sudo apt install cron
sudo systemctl enable --now cron
crontab -l 提示 no crontab for ... 并非报错,只说明你还没安排它加班。
2. 五颗星,不是在给服务打分
一条常见任务长这样:
* * * * * /usr/bin/echo '到点了'
前五段分别表示:
分 时 日 月 星期
* * * * *
* 表示该字段的每个取值;还可以用 , 列举、- 表示范围、/ 表示步长。
| 表达式 | 什么时候执行 |
|---|---|
* * * * * |
每分钟 |
*/5 * * * * |
每五分钟 |
0 3 * * * |
每天 03:00 |
30 9 * * 1-5 |
周一至周五 09:30 |
0 0 1 * * |
每月 1 日零点 |
注意:“日”和“星期”同时指定时,经典 cron 的匹配规则可能是二者满足其一就执行。新手先别把两列都写成具体值。
3. 把任务写进计划表
编辑当前用户的任务:
crontab -e
新增一行、保存退出后,调度器就会读取新配置;不用手动重启 cron。
查看已配置的任务:
crontab -l
删除某一项:用 crontab -e 删掉对应行。
千万别手滑执行 crontab -r:它会删除当前用户的全部定时任务,不是只删除一条。
4. 实战:让小企鹅每分钟打一次卡
先创建脚本:
mkdir -p "$HOME/linux-lab/cron"
cat > "$HOME/linux-lab/cron/heartbeat.sh" <<'EOF_SCRIPT'
#!/bin/bash
echo "企鹅打卡:$(/bin/date '+%F %T')"
EOF_SCRIPT
chmod +x "$HOME/linux-lab/cron/heartbeat.sh"
手动运行,先确认脚本没问题:
/bin/bash "$HOME/linux-lab/cron/heartbeat.sh"
再执行 crontab -e,添加下面这一整行:
* * * * * /bin/bash "$HOME/linux-lab/cron/heartbeat.sh" >> "$HOME/linux-lab/cron/heartbeat.log" 2>&1
等下一次整分钟过去后检查:
tail -n 5 "$HOME/linux-lab/cron/heartbeat.log"
你会看到类似:
企鹅打卡:2026-11-04 10:01:00
企鹅打卡:2026-11-04 10:02:00
这里的 >> 表示追加日志;2>&1 表示把错误输出也记进同一个文件。打完卡记得在 crontab -e 中删除实验任务,别让企鹅全年无休。
5. 到点没执行?它可能不是懒
定时任务失踪,按顺序排查:
① 服务是否运行
systemctl status cron
② 任务有没有写进去
crontab -l
③ 脚本能不能独立运行
/bin/bash "$HOME/linux-lab/cron/heartbeat.sh"
④ 看调度日志(部分系统可用)
sudo journalctl -u cron --since '1 hour ago'
另外三大坑尤其常见:
- 路径:
cron的工作目录未必是你的项目目录。脚本尽量用绝对路径。 - 环境变量:定时任务的
PATH往往比交互式终端少;命令找不到时写完整路径。 - 权限与时区:用谁的
crontab,通常就以谁的身份运行;执行时间还受机器时区影响,可用timedatectl检查。
补充一个冷知识:crontab 命令部分中的 % 有特殊含义;复杂日期格式最好写进 .sh 脚本,别直接塞到任务行里。
6. 真正上生产,还要想两件事
任务跑太久怎么办? 每五分钟触发一次,但上一次还没结束,就可能多份脚本同时工作。可用 flock 防止重叠:
*/5 * * * * /usr/bin/flock -n /tmp/demo-cron.lock /bin/bash "$HOME/linux-lab/cron/heartbeat.sh" >> "$HOME/linux-lab/cron/heartbeat.log" 2>&1
机器关机了怎么办? 传统 cron 通常不会自动补执行关机期间错过的任务。需要补跑、依赖管理或更细的调度能力时,可以进一步了解 systemd timer。
还有一条底线:生产备份先验证恢复流程,别以为“定时执行成功”就等于“数据保住了”。
7. 本章挑战
把上一章的服务器巡检脚本改成每天上午 9 点执行,结果写入日志;然后回答:
- 对应的五字段表达式怎么写?
- 怎么确认任务已经保存?
- 日志没有更新,你会先查哪三处?
参考调度时间:
0 9 * * *
本章口诀:先手动跑通,再交给 cron;日志要留下,任务别重叠。
下一章:《第十章:磁盘空间——“硬盘明明很大,怎么又提示没地方了?”》
- 点赞
- 收藏
- 关注作者
评论(0)