如何使用Cron Job运行Shell脚本

4
我有一个如下的Shell脚本:
 echo "Hello World"

脚本位于 /root/scripts/ 文件夹中,文件名为 test.sh

同时我还创建了以下 cron 任务:

  0-59 * * * *  ./scripts/test.sh

现在cron工作不会每分钟打印test.sh中的内容。

请告诉我是否给出了错误的目录或者代码中有其他问题。

4个回答

7

我想提醒你:

  1. 在执行目录中明确说明要执行的目录,例如 /root/scripts/test.sh。我不知道cron会将哪个目录视为“当前”目录。
  2. 将标准输出重定向到日志文件(例如: ...test.sh > /tmp/cron.log)。你可能也想使用 2>&1 重定向标准错误输出。否则,你看不到输出内容,它会发送到cron任务的所有者的邮箱里。
  3. 确保已经给予你的Bash脚本执行权限(chmod +x /root/scripts/test.sh)。
  4. 明确指出哪个可执行脚本将执行你的shell脚本。最好在顶部加入一个脚本调用,例如 #!/bin/sh 或其他类似的命令。

将任务设置为在cron下运行是非常棘手的。因为cron jobs是在一个大大缩小的环境下运行的。可以使用 env 命令打印可用于你的脚本的环境变量,并与交互式shell中可用的环境变量进行比较和对比。


脚本执行后,我可以在终端看到“Hello World”吗? - user1093513
不,cron命令的输出会通过电子邮件发送给crontab的所有者。 - Douglas Leeder
@DouglasLeeder - 感谢您关于邮寄的提醒。我已经在答案中包含了它。 - Brian Agnew

4
新的Unix用户在使用cron启动脚本时,遇到的一个常见问题是他们的cron作业没有访问和用户shell相同的环境。因此,在用户的shell中执行的脚本可以完美地工作,但是从cron启动时会失败。在这种情况下,罪魁祸首是您的Shell的$PATH环境变量与cronjob的Shell不同。
要测试,请运行'/bin/echo $ PATH> myShellPath'。在cron中运行'/bin/echo $ PATH> myCronPath'。将myShellPath与myCronPath进行比较。
在所提供的示例中,脚本执行echo,在我的CENTOS6系统上可以在/bin下找到。 shell通过在$PATH环境变量列出的目录之一中搜索“echo”文件来查找echo命令。如果您的cronjob的$PATH环境变量不包括/bin,则echo命令将失败。
如果这是问题,最简单的解决方案是在脚本中明确设置路径以获取echo。要查看echo的系统完整路径,请在shell中键入“which echo”。
示例:
[countChocula@bozo ~]$ which echo
/bin/echo

在这种情况下,您需要编辑脚本并将“echo”替换为“/bin/echo”。更好的方法是在脚本中设置$PATH变量,以包括echo所在的目录。
如需进一步了解,请研究“我正在运行哪个shell以及我的环境变量是如何设置的?”,“cron使用哪个shell,以及我如何设置cron环境变量?”,“如何查看我的cron作业的环境变量?”

2

你应该使用

* * * * * /path/to/scriptFile

为了每分钟运行脚本

并检查你的脚本文件夹的所有者是否有执行脚本的权限,如果没有权限则授权或更改拥有权限的所有者


嗨,我写了一个脚本,如果我手动使用它而不是使用cron,它可以很好地工作,但在cron上它就无法工作。这是我的cron:* * * * * sudo /opt/modulo/log/check.sh 如果你能帮助我,我会很高兴。 - Tomer

0
当你把文件添加到cron中时,不要理解为'./scripts/test.sh'。因此,你应该按照以下方式添加cron:
  0-59 * * * *  bash /root/scripts/test.sh

然后你可以为文件添加权限:

chmod a+x /root/scripts/test.sh

当脚本运行时,一切正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接