操作系统:Kylin V4 基于 Ubuntu 15.04
记录这次在国产化操作系统Kylin上配置crontab时,发现配置是正确的,但是crontab就是不生效的问题。
配置方法
提前准备了一份文件crontab.conf,仅包含以下内容,每一分钟打印一次
*/1 * * * * echo test
拷贝该文件到root身份对应的crontab配置处
cp crontab.conf /var/spool/cron/crontabs/root
运行cron -l 发现配置已经生效:
root@i-AA788BA8:~# crontab -l
*/1 * * * * echo test
查看cron日志
tailf /var/log/cron.log
# ubuntu 默认不开启cron日志需要手工开启
/etc/rsyslog.d/50-default.conf
删除cron行注释,重启service rsyslog restart
之后查看日志tailf /var/log/cron.log
此时,发现日志中并没有运行echo test
的脚本,通过重启cron也解决不了问题
service cron restart
解决方案
尝试使用最原始的手工配置方案,通过crontab -e
命令手工编辑。
初次使用crontab -e系统会提示,选择编辑器,选择任意编辑器即可
手工编辑任意代码,比如echo test2
,然后保存退出,注意一定要有内容变化。
这时查看日志,发现crontab正常运行了。
Mar 2 10:13:01 i-AA788BA8 CRON[29992]: (root) CMD (echo test2 )
Mar 2 10:13:01 i-AA788BA8 CRON[29991]: (CRON) info (No MTA installed, discarding output)
Mar 2 10:14:01 i-AA788BA8 CRON[31354]: (root) CMD (echo test2 )
Mar 2 10:14:01 i-AA788BA8 CRON[31353]: (CRON) info (No MTA installed, discarding output)
这就很诡异了,难道一定要手工编辑才可以生效吗,这对linux自动化操作非常不友好。
这时我们查看文件权限,发现手工编辑对文件的所属组发生了变化,所属组由root变为了crontab。
root@i-AA788BA8:~# ll /var/spool/cron/crontabs/root
-rw------- 1 root root 23 Mar 2 10:07 /var/spool/cron/crontabs/root
# 手工编辑后
root@i-AA788BA8:~# ll /var/spool/cron/crontabs/root
-rw------- 1 root crontab 23 Mar 2 10:07 /var/spool/cron/crontabs/root
我们通过测试删除重建,看下是否解决问题。
rm -rf /var/spool/cron/crontabs/root
cp crontab.conf /var/spool/cron/crontabs/root
chgrp crontab /var/spool/cron/crontabs/root
root@i-AA788BA8:~# ll /var/spool/cron/crontabs/root
-rw------- 1 root crontab 23 Mar 2 10:07 /var/spool/cron/crontabs/root
运行到这一步,理论上已经解决了问题,但是发现依旧无法运行。
怀疑是文件编码有问题,但是通过命令也没有看到有什么区别,尝试拷贝已经正常的文件作为模板文件。
cp /var/spool/cron/crontabs/root ~/cron.conf
然后再测试删除重建的流程,发现已经运行正常。这里可能是crontab -e命令对文件的编码格式做了一些事情。
结论
- ubuntu系统的root配置文件路径在
/var/spool/cron/crontabs/root
- 该文件需要所属组修改为crontab
- 该文件可能有特殊格式,需要拷贝正确的文件作为模板,进行自动化相关工作。