cronjob不会执行独立运行的脚本

时间:2016-04-27 09:36:57

标签: linux bash ubuntu sh crontab

我在/var/www/html/dbsync/index.php中有我的php脚本文件。 cd /var/www/html/dbsync/并运行php index.php时效果非常好。

我想通过sh文件调用PHP文件,SH文件的位置如下

/var/www/html/dbsync/dbsync.sh

这是dbsync.sh文件的内容:

/usr/bin/php /var/www/html/dbsync/index.php >> /var/www/html/dbsync/myscript.log 2>&1 -q -f

当我cd /var/www/html/dbsync/并运行./dbsync.sh时,它也可以完美运行。

现在,如果我按如下方式设置crontab:

1 * * * * /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync

但是,此crontab未按预期工作。

有什么不对?

2 个答案:

答案 0 :(得分:6)

正如评论中所见,问题在于您没有定义应该使用哪个程序来执行脚本。考虑到cronjob是在一个微小的环境中执行的;在那里,可以假设不多。这就是我们定义完整路径等的原因。

所以你需要说出类似的话:

1 * * * * /bin/sh /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync
#         ^^^^^^^

/bin/sh是您要用来执行脚本的二进制文件。

否则,您可以设置脚本的执行权限并添加shell-script header告诉它要使用的解释器:

#!/bin/sh

如果这样做,则无需添加二进制文件的路径。

来自Troubleshooting common issues with cron jobs

  

使用相对路径。如果您的cron作业正在执行某些脚本   好的,你必须确保只使用该脚本中的绝对路径。   例如,如果您的脚本位于/path/to/script.phpand   你试图在同一目录中打开一个名为file.php的文件,   你不能使用相对路径,如fopen(file.php)。该文件必须   从它的绝对路径调用,如下所示:fopen(/path/to/file.php)。   这是因为cron作业不一定从目录中运行   脚本所在的位置,因此必须专门调用所有路径。

另外,我知道你想每分钟运行一次。如果是这样,1 * * * *将不会这样做。 Intead,它将运行at every 1st minute past every hour。因此,如果您想每分钟运行一次,请说* * * * *

答案 1 :(得分:1)

了解"登录shell"非常重要。和#34;交互式shell"它们意味着什么。

  • 登录shell:当您使用ssh会话登录并获得一个终端窗口时,您可以输入shell命令。登录后,系统会执行一些文件(.bashrc)并为您设置一些环境变量,例如PATH变量。
  • interactive shell:登录系统后,可以手动启动shell终端。系统会执行分配给您帐户的一些配置文件(.bash_profile,.bash_login,.profile)。此文件还为您手动打开的shell会话设置了一些环境变量并初始化PATH变量。

通过OS启动shell脚本和cron作业不适合上面提到的启动shell的方式。因此,不会执行任何系统脚本(.bashrc)或用户配置文件。这意味着我们的PATH变量未初始化。无法找到Shell命令,因为PATH变量未指向正确的位置。

这解释了为什么您的脚本在手动启动时成功运行,但在通过crontab启动时失败。

<强>解决方案-1: 使用每个shell命令的绝对路径,而不是仅使用脚本文件中使用的命令名称。

  • 而不是&#34; awk&#34;使用&#34; / usr / bin / awk&#34;
  • 而不是&#34; sed&#34;使用&#34; / bin / sed&#34;

解决方案-2:在执行shell脚本之前初始化环境变量,尤其是PATH变量!