我有一个 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
几乎所有从命令行正确运行脚本的问题都来自cron
PATH 变量的设置。根据man 5 crontab
Vixie 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