我有这个 sh 脚本:
ufw allow 27017 && iptables -F
在文件 test.sh 中
我想每天 07:00 使用 root 的 cronjob 运行它,如下所示:
0 7 * * * /root/cron/test.sh
我还检查了这个脚本是否确实使用 grep CRON /var/log/syslog 运行,我可以看到它确实运行了:
8 月 24 日 07:00:01 vps118774 CRON[1672]: (root) CMD (/root/cron/test.sh)
现在我的问题是 test.sh 中的实际脚本无法正确运行以解锁使用该 cronjob 运行的端口,重点是如果我使用以下命令从服务器上的终端手动运行该脚本:
sh script.sh
一切正常,脚本将采取所需的操作,因此脚本按预期运行,但是我的 cron 执行有什么问题吗?
我把执行日志得到了这些:
root/cron/test.sh: 2: /root/cron/test.sh: ufw: 未找到
答案1
Cron 作业在 shell 环境中运行,该环境可能与普通的交互式 shell 环境不同。例如,该PATH
变量中可能包含不同目录的列表,并且可能缺少一些您习惯于从中执行实用程序的目录。
找出ufw
实用程序所在的位置(command -v ufw
在命令行上使用),然后
- 在脚本中使用该实用程序的完整路径,或者
- 修改
PATH
脚本内的变量,使其包含可以找到ufw
实用程序(和)的目录。iptables
如问题所示,该脚本缺少正确的#!
- 行。如果您显式运行它,这不是问题sh
,但您不会在 cron 作业规范中这样做。相反,使脚本可执行,然后将其编写为
#!/bin/sh
PATH="$PATH:/usr/sbin:/sbin"
ufw allow 27017 && iptables -F
然后从 crontab 中调用脚本,就像您当前所做的那样。
在这里,我还将两个目录/usr/sbin
和添加/sbin
到PATH
变量中,只是为了展示如何在脚本中执行此操作。