Linux定时任务设置与执行结果检查
定时任务需要同时满足“调度服务可用、时间表达式正确、命令在非交互环境可执行”。本篇先创建只往自己目录写时间的练习任务,不用正式备份、扣费或重启命令来试验。所有步骤由实际运行任务的系统用户操作。
准备可手动运行的脚本
mkdir -p "$HOME/baole-cron"
nano "$HOME/baole-cron/check-time.sh"
在脚本中填写以下内容,保存后退出。脚本不要求执行位,因为后面明确交给/bin/sh运行。
#!/bin/sh
/usr/bin/date -Is >> "$HOME/baole-cron/run.log"
/bin/sh "$HOME/baole-cron/check-time.sh"
tail -n 5 "$HOME/baole-cron/run.log"
先确认手动执行可以在run.log追加一行时间。若失败,先处理路径、权限或磁盘问题,不进入定时设置。脚本中使用绝对命令路径,避免依赖交互终端的PATH、别名、虚拟环境或当前目录。
添加用户任务
crontab -l
crontab -e
保留原有任务,在末尾新增一行,并确保文件最后有换行:
* * * * * /bin/sh "$HOME/baole-cron/check-time.sh" >> "$HOME/baole-cron/task-error.log" 2>&1
| 字段 | 从左到右的范围 |
|---|---|
| 分 | 0—59 |
| 时 | 0—23 |
| 日 | 1—31 |
| 月 | 1—12 |
| 星期 | 0—7,0和7通常均为星期日 |
五个星号表示每分钟匹配一次。用户crontab后面直接写命令,不再写用户名;/etc/crontab等系统表格式不同,不要混用。cron对命令中的未转义百分号有特殊处理,把复杂命令写进脚本可减少转义错误。
检查调度与实际结果
crontab -l
systemctl status cron.service --no-pager
tail -n 10 "$HOME/baole-cron/run.log"
cat "$HOME/baole-cron/task-error.log"
至少经过两个预计执行时点后,run.log应新增对应时间记录。服务状态正常、crontab中看得到任务,都不能代替检查新输出。精简镜像若没有cron,先按发行版的软件与服务管理方式安装和启用;不要在尚未确认原有调度体系时再并行部署另一套重复任务。
任务不执行或执行异常
- 核对服务器时区与实际日期;修改时区可能改变业务任务的执行时点。
- 用任务所属用户手动执行同一脚本,检查HOME、文件权限、绝对路径和脚本解释器。
- 看错误文件及cron服务日志;默认环境通常比SSH交互登录少,终端里成功不代表定时环境成功。
- 执行时间可能超过间隔的业务任务要设计互斥与超时,不能无控制地叠加运行。
- 不要把密码或令牌直接写进crontab。调试完成后删除这条练习行并再次crontab -l确认,保留原有业务任务。