繁体   English   中英

cronjob 不执行独立运行的脚本

[英]cronjob does not execute a script that works fine standalone

我在/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 没有按预期工作。

有什么问题?

从注释中可以看出,问题在于您没有定义应使用哪个程序来执行脚本。 考虑到cronjob是在很小的环境中执行的; 在那里,没有什么可以假设的。 这就是为什么我们定义完整路径等的原因。

因此,您需要说些类似的话:

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

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

否则,您可以设置脚本的执行许可权,并添加一个shell脚本标头,告诉标头使用什么解释器:

#!/bin/sh

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

对cron作业的常见问题进行故障排除

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


另外,我知道您想每分钟运行一次。 如果是这样,则1 * * * *将不起作用。 Intead,它将在每小时的第一分钟开始运行。 因此,如果您想每分钟运行一次,请说* * * * *

重要的是要了解“登录外壳”和“交互式外壳”的含义。

  • login shell:在使用ssh会话登录并获得一个可以在其中输入shell命令的终端窗口时简要介绍。 登录后,系统将执行一些文件(.bashrc)并为您设置一些环境变量,例如PATH变量。
  • 交互式外壳程序:登录系统后,您可以手动启动外壳程序终端。 系统执行一些分配给您帐户的配置文件(.bash_profile,.bash_login,.profile)。 该文件还设置了一些环境变量,并为您手动打开的shell会话初始化PATH变量。

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

这解释了为什么如果手动启动脚本会成功运行,但是通过crontab启动脚本却会失败。

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

  • 代替“ awk”,使用“ / usr / bin / awk”
  • 代替“ sed”使用“ / bin / sed”

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

方法 1,在您的 dbsync.sh 中添加此标头:

#!/bin/bash -l

方法2,在你的cron文件中添加bash -l:

1 * * * * bash -l /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM