linux系统中定时任务可以通过/etc/crontab文件配置,具体怎么定时网上有文档,就不赘述了。
注意:这里的PATH,务必和系统路径PATH保持一致。
#查看系统路径
echo $PATH
示例输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
一般来讲,正常执行脚本命令的时候,处于系统路径下的可以省略路径,直接输入脚本名执行的。例如:/usr/bin/nginx,可以直接执行nginx -s reload来重启,而不需要进入nginx目录后用./nginx -s reload来重启。
而crontab文件的PATH其实是类似的,如果不一致可能导致定时任务失效,例如:
SHELL=/bin/bash
#此时缺少$PATH部分路径
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
用定时任务,执行以下命令:
#默认按cron最短间隔,1分钟执行一次
* * * * * root ipsec status >> /root/shell/output.log
保存后重启cron:systemctl restart crond
查看日志文件output.log,会发现结果为空,因为该脚本在/usr/local/sbin路径下,crontab文件没有包含这个路径,就无法省略路径执行。
单独执行ipsec status命令,就没有问题(输出表明:连接数为0)。
解决办法自然是在crontab文件中补上/usr/local/sbin路径。
总结
使用cron定时任务时,务必保证PATH参数和系统参数一致。不然有的脚本省略路径执行命令(大部分情况都会省略),手动执行没有问题,定时执行就无法保证了。