crontab 是一个 Linux 定时任务工具,通常我们在写好一个脚本时如果需要定时运行,都会借助 crontab。今天老王在写好一个脚本时,测试时没有问题,但是当 crontab 定时执行时却报错:iptables command not found,本文分享下出现这个问题的原因和解决办法。
一、前言
写完脚本并完成测试后我就直接加入到 crontab 里去了:
*/5 * * * * /root/ip_block.sh > /dev/null 2>&1 &
结果发现 iptables 规则似乎没有添加成功,于是添加了日志文件记录:
*/5 * * * * /root/ip_block.sh >> /root/block.log 2>&1
结果发现报错:iptables command not found
其实看到了这个错误老王就想到应该是 bash 和 sh 的问题,因为之前老王出现过crontab 任务中 Shell 脚本 for 循环不生效的问题原因与解决。去网上搜了下,在使用 crontab 任务时,不仅仅是 iptables,很多 Linux 自带的包都会出现 command not found 的错误,自己在 shell 脚本或者控制台执行的好好的,但是一旦加入 crontab 里,就报错 command not found,导致这个错误的原因是 PATH,我们调试时,执行环境是 /bin/sh,而 crontab 的执行环境是默认环境变量。
二、解决办法
以 iptables command not found 错误为例分享下解决办法。
1、添加 PATH
在 shell 脚本的最上方添加声明:
PATH=/usr/sbin:/sbin:/usr/bin:/bin
这样就可以直接执行 iptables 了。
2、绝对路径执行命令
先用 which iptables
找到 iptables 路径(返回 /sbin/iptables),之后将 shell 脚本中的 iptables 均改成 /sbin/iptables 即可。
which iptables /sbin/iptables
修改如下:
/sbin/iptables -A INPUT -s $p -j REJECT