记录一次使用crontab未执行的排错过程

发布于:2025-07-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

一、过程复现

1. 命令有效性排查

2. 查看日志

3. 扩展测试

4. 问题解决

二、总结


一、过程复现

我在学习使用crontab计划任务时,想实现每一分钟格式化输出一次当前日期和时间的效果,于是尝试:

crontab -e
* * * * * date "+%F %T"    # 写入

crontab -l
* * * * * date "+%F %T"    # 查看,确实写入了

1. 命令有效性排查

然而我等了几分钟,屏幕上却没有任何输出,于是我在命令行手动执行一下这个命令:

date "+%F %T"
2025-07-15 11:19:08    # 成功显示

2. 查看日志

发现这个命令执行并没有问题,顺带确认了一下crond服务确实是启动了,于是我去/var/log/cron下查看cron日志:

tail /var/log/cron 
Jul 15 11:15:32 rhel crontab[4246]: (root) LIST (root)
Jul 15 11:16:01 rhel CROND[4248]: (root) CMD (date "+)
Jul 15 11:17:01 rhel CROND[4277]: (root) CMD (date "+)
Jul 15 11:18:01 rhel CROND[4311]: (root) CMD (date "+)
Jul 15 11:19:01 rhel CROND[4344]: (root) CMD (date "+)
Jul 15 11:20:01 rhel CROND[4375]: (root) CMD (date "+)
Jul 15 11:21:01 rhel CROND[4410]: (root) CMD (date "+)
Jul 15 11:22:01 rhel CROND[4444]: (root) CMD (date "+)
Jul 15 11:23:01 rhel CROND[4473]: (root) CMD (date "+)
Jul 15 11:24:01 rhel CROND[4503]: (root) CMD (date "+)

终于发现问题了,奇怪,这个"%"竟然没有被cron识别出来,命令当然没有被完整执行。我猜想这个"%"在cron文件中可能有特殊含义,于是我加上转义字符,尝试:

crontab -e
* * * * * date "+\%F \%T"    # 在文件中添加转义字符

这下总该没问题了吧,然而我又等了一分钟,屏幕上还是没有任何输出,我再次查看日志:

tail -2 /var/log/cron 
Jul 15 11:30:01 rhel CROND[4708]: (root) CMD (date "+%F %T")
Jul 15 11:31:01 rhel CROND[4741]: (root) CMD (date "+%F %T")

3. 扩展测试

发现该命令确实可以被cron识别到了,但是为什么屏幕上没有输出呢,我心想屏幕没有输出那我就输出在一个文件里:

crontab -e
* * * * * date "+\%F \%T" > test.txt

一分钟后发现该文件确实存在了,且有内容:

cat test
2025-07-15 11:38:01

于是我想到我使用的是xshell远程连接的Linux,所以我的终端对于Linux来说是一个字符设备,那么我应该将输出重定向到终端上,一定是这样:

w        # 查看终端设备
 11:43:47 up  1:42,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.101.190  10:01    1.00s  0.21s  0.00s w
root     pts/1    192.168.101.190  10:11    5:43   0.06s  0.00s tail -f /var/log/cron

crontab -e    # 编辑cron文件
* * * * * date "+\%F \%T" > /dev/pts/0

4. 问题解决

终于,久违的输出终于出现了:

[root@rhel ~]# 2025-07-15 11:44:01
2025-07-15 11:45:01
2025-07-15 11:46:01

经过以上实验,正确的写法应该是:* * * * * date "+\%F \%T" > /dev/pts/0

二、总结

经过这一过程,我认识到crontab文件的编写对命令有一些特殊要求:

  1. 对于命令中的特殊字符,比如格式化中的"%"前面需要加转义字符"\",crontab才能识别出。
  2. 对于远程连接Linux的方式,想要输出在屏幕上需要重定向到当前终端。

此外,我查阅资料总结出可能导致crontab执行失败的其他原因:

  1. Crond 服务未启动
  2. 权限问题。脚本未设置执行权限导致任务执行失败。
  3. 路径问题。在 crontab 中要使用绝对路径而不是相对路径,以确保脚本能正确找到。
  4. 时区问题。服务器与客户端的时区不一致可能导致定时任务不执行。
  5. 环境变量问题。有时候命令中含有变量,但 crontab 执行时却没有,这也会造成执行失败。

所以,当crontab执行失败后,我们可以结合/var/log/cron中的日志或者是邮件提示(在系统计划任务中才有邮件,即/etc/crontab文件中设置的),在命令或脚本中逐一排查以上可能出现的问题。


网站公告

今日签到

点亮在社区的每一天
去签到