目录
一、过程复现
我在学习使用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文件的编写对命令有一些特殊要求:
- 对于命令中的特殊字符,比如格式化中的"%"前面需要加转义字符"\",crontab才能识别出。
- 对于远程连接Linux的方式,想要输出在屏幕上需要重定向到当前终端。
此外,我查阅资料总结出可能导致crontab执行失败的其他原因:
- Crond 服务未启动。
- 权限问题。脚本未设置执行权限导致任务执行失败。
- 路径问题。在 crontab 中要使用绝对路径而不是相对路径,以确保脚本能正确找到。
- 时区问题。服务器与客户端的时区不一致可能导致定时任务不执行。
- 环境变量问题。有时候命令中含有变量,但 crontab 执行时却没有,这也会造成执行失败。
所以,当crontab执行失败后,我们可以结合/var/log/cron中的日志或者是邮件提示(在系统计划任务中才有邮件,即/etc/crontab文件中设置的),在命令或脚本中逐一排查以上可能出现的问题。