Linux:这啥命令?这台服务器我说了算-定时任务——“凌晨三点的活,为什么要我醒着干?”

举报
yd_240046519 发表于 2026/11/04 10:01:29 2026/11/04
【摘要】 第九章:定时任务——“凌晨三点的活,为什么要我醒着干?”凌晨三点,服务器要备份;早上九点,要生成报表;每隔五分钟,还得巡检一次服务。难道你要抱着电脑熬夜?不,Linux 有自己的闹钟——cron。本章以 Ubuntu/Debian 为例。学完你能让脚本定时运行,还能查出它为什么“到点装睡”。 1. 先认识两位主角cron:后台定时调度服务,负责盯时间。crontab:用来编排个人定时任务的...

第九章:定时任务——“凌晨三点的活,为什么要我醒着干?”

凌晨三点,服务器要备份;早上九点,要生成报表;每隔五分钟,还得巡检一次服务。

难道你要抱着电脑熬夜?不,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 点执行,结果写入日志;然后回答:

  1. 对应的五字段表达式怎么写?
  2. 怎么确认任务已经保存?
  3. 日志没有更新,你会先查哪三处?

参考调度时间:

0 9 * * *

本章口诀:先手动跑通,再交给 cron;日志要留下,任务别重叠。

下一章:《第十章:磁盘空间——“硬盘明明很大,怎么又提示没地方了?”》

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。