Cronjob 无法正常运行

Tat*_*dan 1 cron shell-script

我有这个 sh 脚本:

ufw allow 27017 && iptables -F
Run Code Online (Sandbox Code Playgroud)

在文件 test.sh 中

我想每天在 07:00 像这样使用 root 的 cronjob 运行它:

0 7 * * * /root/cron/test.sh
Run Code Online (Sandbox Code Playgroud)

我还检查了这个脚本是否真的使用 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
Run Code Online (Sandbox Code Playgroud)

一切正常,脚本将采取所需的操作,因此脚本按预期运行,但是我的 cron 执行有什么问题?

我把执行的日志得到了这些:

root/cron/test.sh: 2: /root/cron/test.sh: ufw: 未找到

Kus*_*nda 8

Cron 作业在 shell 环境中运行,该环境可能与您的普通交互式 shell 环境不同。例如,PATH变量中可能包含不同目录的列表,并且可能缺少一些您习惯于从中执行实用程序的目录。

找出该ufw实用程序的位置(command -v ufw在命令行上使用),然后

  1. 在脚本中使用该实用程序的完整路径,或
  2. 修改PATH脚本内的变量,使其包含可以找到ufw实用程序(和iptables)的目录。

如问题所示,脚本缺少正确的行#!。如果您sh显式运行它,这不是问题,但您不会在 cron 作业规范中这样做。相反,使脚本可执行,然后将其编写为

#!/bin/sh

PATH="$PATH:/usr/sbin:/sbin"

ufw allow 27017 && iptables -F
Run Code Online (Sandbox Code Playgroud)

然后从您的 crontab 中调用脚本,就像您目前正在做的那样。

在这里,我还添加了两个目录/usr/sbin,并/sbinPATH变量,只是为了说明一个可以如何做到这一点的脚本。