当我从命令行运行 BASH 脚本时,它会被执行。 当我尝试将其作为 cron 任务运行时,它失败了。通过异常的方法,我发现了一个问题。它在于“which iptables”命令返回一个空字符串。我尝试在“/sbin”目录中查找的所有程序都会发生这种情况。 示例:
# crontab -e
* * * * * /root/test.sh >> /root/test.log 2>&1
测试.sh
#!/bin/bash
IPT=$(which iptables);
echo ${IPT} >> /root/test.log
但是在test.log中写入了空字符串。 在 Ubuntu 16.04 和 Debian 8 上测试。
最佳答案
与权限无关。
which
在 $PATH
中查找命令。 cron
脚本的路径有限,不包括 iptables
,因此找不到它。
$ /usr/bin/which iptables
/sbin/iptables
$ PATH=/bin:/usr/bin /usr/bin/which iptables
$ echo $?
1
当你的路径有限时,它将返回一个空字符串(在我的另一台机器上,它报告(/usr/bin:/bin)中没有 iptables,所以 YMMV)并以非零代码退出。
如果你执行类似 echo $PATH >>/root/test.log
的操作,你会看到 cron
的路径只有 /usr/bin
和 /bin
您必须设置 $PATH
以包含 iptables
位置,或者在调用 iptables
时使用完整路径
关于linux - cron 权限有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205232/