最近逛论坛和问答的时候,遇见好几次求助,crontab不执行,大部分的情况是写的脚本手动执行成功,但是crontab就是不执行,下面的回复天马行空,有说检查用户权限的,有说检查系统时间的,简直无语,特立此帖扫盲,篇幅很小,都是精华。
crontab是绑定用户的
你用什么用户去创建的crontab,那么他执行的时候也是用什么用户身份. 我不想解释为什么,你看完第二条并且运行我给的命令以后就知道了.我想也没有人会用root去写个sh,然后su otheruser 去crontab -e吧? 有的话当我没说。所以和用户权限无关。至于sh文件的权限,没有执行权限手动都运行不了,但需要注意,在/etc/下有一个cron.deny文件,里面定义了那些用户不能执行crontab(默认存在但里面为空),相应的你可以手动创建dean.allow文件来保存那些用户可以执行crontab,注意:当deny和allow同时存在的时候,仅allow生效,root用户不受此限制,你把root写进去也没用.
crontab是有自己的环境变量的
环境变量是什么,我不想大篇幅的去描述,也不想复制百科,简单的理解就是你的身份证,上边有你住址年龄身份,至于查看环境变量,你可以在终端输出export来查看当前登陆bash的用户的环境变量,注意是当前用户的bash环境变量,但corntab有一套自己的环境变量,写个定时脚本
* * * * * export > /root/crontab.log
等一分钟以后去看这个文件,比较一下用户的环境变量和crontab的环境变量有什么区别,区别大了,我这里只说经常导致出错的问题
1.path 就是命令的执行路径,crontab寻找命令的路径只有/usr/bin:/bin 而用户的 echo $PATH看一下 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin,一些常用命令都在/bin或者/usr/bin下 比如ls 所以你不需要 /bin/ls 这样去执行,但是某些命令,比如ifconfig chkconfig等在/sbin目录,不在这两个目录。当你手动运行的时候,你的path里面有这个路径,所以不需要绝对路径,不过放在crontab里面嘛,呵呵,他找不到。所以,在shell中请使用绝对路径,除非你非常肯定这几个命令在/bin或者/usr/bin下 ,如果你不清楚命令在哪,还比较懒不想写绝对路径,那么请使用whereis 或者 find 查一下你脚本中的路径在不在上述目录中
2.lang 字符集,我非常不建议使用shell去处理中文,不是说不能处理,而是很容易出错,用户的lang为utf-8而crontab为gbk或者asc的我见过不少,运行出来以后各种不可描述。
3.其它诸如 shell home user pwd等等 我需要我多说了吧
请确保你的脚本能够手动正确运行再添加crontab
本文讨论的只是手动运行正确的shell脚本,语法不明的建议先去<<shell变成从入门到精通>>,看了此帖并且修复过你的脚本后,如果你手动运行成功corn运行失败,请扔板砖.