定时任务运行环境
最近在工作中需要用定时任务crontab
执行一个脚本,脚本中用到了一些位于/sbin
目录下的命令(如iptables
),直接运行脚本没问题,但是发现当在定时任务中执行时,这些命令不会运行。
经过查阅资料发现crontab
不会从用户profile文件中读取环境变量参数。
crontab
环境变量位于/etc/crontab
目录下
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
- SHELL变量指定了系统要使用哪个shell,这里是bash
- PATH变量指定了系统执行命令的路径
- MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
手动执行的环境是当前账户的配置文件~/.bash_profile
解决方法:
- 将脚本里的命令用绝对路径,如
/sbin/iptables
- 在脚本前导入环境变量
source ~/.bash_profile source /etc/profile
- 在/etc/crontab中添加环境变量。 即可在PATH属性后面添加,也可以在执行对应的命令之前,加入一条命令,使得环境变量生效。
* * * * * . /etc/profile;/bin/sh /root/demo.sh