crontab命令的注意事项
crontab可以让ubuntu定时执行制定的任务,但经常出现的事情是,任务没有正确执行。而且它往往还没有错误提示。你会发现脚本会被执行,但执行没有结果信息。
这里面很关键的问题有两个:
- 系统参数的问题
- 工作目录的问题
1. 系统变量的问题
正常命令行是在bash
或类似的shell环境下,系统已经载入了很多环境变量。但crontab是没有这些操作的,因此系统环境参数跟命令行测试环境可能并不一致。
具体而言,可以crontab -e
中加入一行:
* * * * * /usr/bin/env > /tmp/contab_env
然后比较一下/tmp/contab_env
跟直接命令行下运行env
的结果的差异。注意执行完毕后回crontab -e
删除刚刚添加的那一行(否则将持续地每分钟运行一次)。
这个问题一种解决办法是在crontab
的命令中先source /home/your_username/.bashrc
。这可以解决大部分问题,但不排除还有其它的参数来自于其它的地方。必要时也可以使用export xxx=yyyy
来直接修改环境变量。
2. 工作目录的问题
在指定工作目录之前,crontab
默认的工作目录是/
。这会引起很多脚本运行异常。解决办法也很简单,可以用cd xxx
切换工作目录。
3. crontab命令的正确姿势
结合上面两个,假设我们要运行的脚本xxx.yy
位于目录/path/to
,那么crontab -e
中应该这么写:
* 0 * * * /bin/bash -l -r "source /home/your_username/.bashrc; cd /path/to; ./xxx.yy"