无法使用 cron 运行 shell 脚本

无法使用 cron 运行 shell 脚本

我有一个 shelltest.sh脚本/home/username

test.sh文件包含以下几行 -

#!/bin/sh

cd /home/username/bin

sh launch.sh  ParameterName

#launch.sh is in /home/username/bin directory

我设置了一个 crontab 条目,如下 -

* * * * * /home/username/test.sh

当我/home/username/test.sh在终端上运行时,它工作正常。但它不起作用cron

答案1

几乎所有从命令行正确运行脚本的问题都来自cronPATH 变量的设置。根据man 5 crontabVixie cron 的说法:

   On the Debian GNU/Linux system, cron supports the pam_env  module,  and
   loads  the  environment  specified  by  /etc/environment and /etc/secu‐
   rity/pam_env.conf.    It   also   reads   locale    information    from
   /etc/default/locale.   However,  the  PAM  settings do NOT override the
   settings described above nor any settings in the crontab  file  itself.
   Note  in particular that if you want a PATH other than "/usr/bin:/bin",
   you will need to set it in the crontab file.

cron虽然其他系统和/或其他实现的细节可能有所不同从 cron 传递的脚本的 PATH 可能比 shell 中的路径受到更多限制

这意味着您的脚本(或从中调用的脚本/程序)调用的任何内容在eg 中/usr/local/bin调用时都不会在运行时找到cron

您可以通过以下方式调用脚本来测试这一点:

 PATH=/usr/bin:/bin /home/username/test.sh

您可以通过扩展 crontab 文件中的路径来解决此问题:

 PATH = /usr/local/bin:/usr/bin:/bin

在调用脚本的实际行之前。变量不会被替换(所以不要这样做PATH = /usr/local/bin:$PATH)。

在脚本顶部附近的某个日志文件中包含 echo 语句也是一种很好的做法:

 TSTLOG=/var/tmp/myscript.log
 echo "invoking script" > "$TSTLOG"
 date >> "$TSTLOG"
 echo "$PATH" >> "$TSTLOG"

(这里故意覆盖echo)。所以你可以检查你的程序是否被调用,以及什么样的环境导致了这个。

您还应该检查您的邮件。在系统本身上,如果系统未设置将电子邮件转发到您的普通帐户。许多 cron 电子邮件不会被注意到,因为没有电子邮件[email protected],系统只是将消息放在用于 cron 的本地帐户可以读取的位置。

答案2

两种选择:

选项 1 - 你有吗chmod +x test.sh

这样你就可以执行 with./test.sh而不是sh test.sh.

选项 2 - 如果您不想 chmod 该文件,请将 crontab 条目更改为

* * * * * /usr/bin/sh /home/username/test.sh

此外,如果你选择后者,你应该sh使用以下命令验证二进制位置

which sh

相关内容