操作系统: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命令对文件的编码格式做了一些事情。

结论

  1. ubuntu系统的root配置文件路径在/var/spool/cron/crontabs/root
  2. 该文件需要所属组修改为crontab
  3. 该文件可能有特殊格式,需要拷贝正确的文件作为模板,进行自动化相关工作。

行愚
13 声望2 粉丝