关于Linux的定时任务crontab执行失败(报错No such file or directory)
crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:
service crond start
如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
yum -y install crontabs
权限问题
比如:脚本没有x执行权限,解决方法:增加执行权限,或者用bash abc.sh的方法执行(chmod 744 test.sh)
- 关于权限
Linux系统中,每个用户的角色和权限划分的很细致也很严格,每个文件(目录)都设有访问许可权限,利用这种机制来决定某个用户通过某种方式对文件(目录)进行读、写、执行等操作。
操作文件或目录的用户,有3种不同类型:文件所有者、群组用户、其他用户。最高位表示文件所有者的权限值,中间位表示群组用户的权限值,最低位则表示其他用户的权限值,所以,chmod 777中,三个数字7分别对应上面三种用户,权限值都为7。
文件或目录的权限又分为3种:只读、只写、可执行。
权限 权限数值 二进制 具体作用 r 4 00000100 read,读取。当前用户可以读取文件内容,当前用户可以浏览目录。 w 2 00000010 write,写入。当前用户可以新增或修改文件内容,当前用户可以删除、移动目录或目录内文件。 x 1 00000001 execute,执行。当前用户可以执行文件,当前用户可以进入目录。 依照上面的表格,权限组合就是对应权限值求和,如下:
7 = 4 + 2 + 1 读写运行权限
5 = 4 + 1 读和运行权限4 = 4 只读权限
因此,大家也就明白了 chmod 744 filename 命令的含义了。
路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:
以root身份登录shell后执行一个/data/test.sh,进入到data目录,只要执行./test.sh
就可以了。
但是在crontab中,就会找不到这个脚本,必须写完整:/data/test.sh
时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
crontab默认是不加载变量的,不要假定cron知道所需要的特殊环境,它其实并不知道。
所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量- 在.sh脚本里面配置变量
1
2
3cat test.sh
#!/bin/sh
source /etc/profile - 在定时任务执行的时候说明变量(本人的方法),**/bin/sh** 如下:
* 3 * * * /bin/sh /data/test.sh >> /data/test.log 2>&1
- 在.sh脚本里面配置变量