crontab是linux 下的定时工具
但是有很多坑
1. 第一个坑 crontab 命令中 %
如果原始命令中带有 %
那么很可能会执行失败 因为crontab中的%号有特殊含义 需要使用 转义字符去转义
例如 下面这个命令 手动执行时候好好的 在crontab中就会失败 就是因为% 已经两次掉进坑里面了 其实可以发现加了反斜杠的%好不加反斜杠的%在crontab 用vim编辑时候的颜色已经不一样了
echo $(date +"%Y%m%d")
2. 第二个坑 crontab 命令忘了加换行符
每个crontab 中的指令需要换行符作为结尾才能生效 所以千万别忘了换行符
3. 第三个坑 crontab 的环境变量和当前路径
crontab的环境变量可能和用户的不太一样 最好在crontab -e时候开头用 PATH=“xxx” 和 SHELL = "xxx"指定
同样 在命令里面不要用相对路径 要用绝对路径 crontab执行时的当前路径和我们shell里面的不一样
4. 第四个坑 crontab 的输出
标准输出 默认输出到MTA 邮件里面 控制台看不到 所以要重定向到某个日志文件中
5. 第五个坑 crontab 没有日志文件
那应该是在 系统日志配置中默认没有打开 找不到/var/log/cron.log
需要配置一下 参考下面的方案
- 刚开始怀疑是cron服务没有启动,遂执行:
sudo service cron status
发现cron服务是running的,排除;
- 继而怀疑是任务文件创建后未能被系统及时get到,因而执行:
sudo service cron restart
重启cron后问题依旧,排除;
- 于是进一步查看cron运行日志(/var/log/cron.log),但是并未找到相关文件,原因是ubuntu默认没有开cron日志,执行命令:
sudo vim /etc/rsyslog.d/50-default.conf
找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:
sudo service rsyslog restart
执行
less -10 /var/log/cron.log再次查看cron运行日志,log出来了,
提示如下信息:
No MTA installed, discarding output
原因是cron把屏幕输出都发送到email了,而当前环境并未安装email server,于是系统报错,解决方面就是不要直接向屏幕输出内容,而是重定向到一个文件。