如何通过Cron Job运行Shell脚本

我有一个像下面的Shell脚本

echo "Hello World" 

该脚本位于/root/scripts/文件夹中作为test.sh

我也创build了一个像下面这样的cron工作

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

现在cron作业不是每分钟都在test.sh打印内容。

让我知道我是否给了一个错误的目录,或者在我的代码中有任何其他问题。

我会

  1. 明确指出。 你的目录从例如/root/scripts/test.sh执行。 我不知道cron会把什么视为当前目录
  2. 将stdout重定向到一个日志文件,例如...test.sh > /tmp/cron.log (你可能想在某个阶段用2>&1重定向stderr)。 否则,你不会看到输出 。 它被邮寄给cronjob所有者
  3. 确保你已经给你的bash脚本执行权限( chmod +x /root/scripts/test.sh
  4. 明确哪个脚本可执行文件将执行你的shell脚本。 在顶部有一个脚本调用,例如#!/bin/sh或类似的脚本是一个好习惯

让东西在cron下运行是非常棘手的。 克朗职位运行在一个大规模的削减环境。 将您的脚本可用的环境(使用env )打印出来,并与您的交互式shell中可用的内容进行比较/对比是有益的。

你应该使用

 * * * * * /path/to/scriptFile 

为每分钟运行脚本

并检查您的脚本文件夹的所有者,如果所有者没有执行脚本的权限允许或更改拥有权限的所有者

在阅读Andrew的正确答案之后,对于那些仍在进行调试的人来说,下一个细节需要考虑:执行cronjob时,必须注意正在执行的脚本可用的环境变量。 在提供的示例中,脚本执行回显,在CENTOS6系统上的回显位于/ bin下。 echo命令是通过搜索$ PATH环境变量中列出的目录中的“echo”文件找到的。 如果cronjob PATH环境变量不包含/ bin,该怎么办? 在这种情况下,echo命令将失败。

要查看$ PATH环境变量的内容,请执行以下操作:

 [mcchiz@bozo ~]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/export/home/mcchiz/bin 

如果这是问题,最简单的解决方案是在脚本中明确地设置路径为“回声”。 要查看系统的完整回显路径,请在shell中输入“which echo”。

例:

 [mcchiz@bozo ~]$ which echo /bin/echo 

因此,在这种情况下,您将编辑脚本并将'echo'替换为'/ bin / echo'

下一个选项是在脚本中设置$ PATH变量来包含echo所在的目录。

如果需要进一步的信息来了解上述情况,研究“我正在运行什么shell以及我的环境变量是如何设置的?”,“什么shell是cron使用的,以及如何设置cron环境变量?”,“如何查看我的cronjob环境变量?”

当你在cron中添加文件的时候不能理解'./scripts/test.sh'。 所以你应该添加cron如下:

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

你可以添加文件的权限:

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

当脚本运行那个okey。