Linux cronjob不执行独立运行良好的脚本

Linux cronjob不执行独立运行良好的脚本,linux,bash,ubuntu,sh,crontab,Linux,Bash,Ubuntu,Sh,Crontab,我的php脚本文件位于/var/www/html/dbsync/index.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/myscri

我的php脚本文件位于
/var/www/html/dbsync/index.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
是要用于执行脚本的二进制文件

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

#!/bin/sh
如果执行此操作,则无需添加二进制文件的路径

发件人:

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



另外,我知道你想每分钟都运行这个。如果是这样,
1****
就不行了。Intead,它将运行。因此,如果你想每分钟都运行它,比如说
***

理解“登录shell”和“交互式shell”的含义是很重要的

  • 登录shell:当您使用ssh会话登录并获得一个终端窗口时,您可以在其中输入shell命令。登录后,系统将执行一些文件(.bashrc)并为您设置一些环境变量,例如PATH变量
  • 交互式shell:登录系统后,您可以手动启动shell终端。系统执行分配给您的帐户的一些配置文件(.bash\u profile、.bash\u login、.profile)。该文件还为手动打开的shell会话设置一些环境变量和初始化路径变量
由操作系统启动的shell脚本和cron作业不适合以上述方式启动shell。因此,不会执行任何系统脚本(.bashrc)或用户配置文件。这意味着我们的PATH变量没有初始化。找不到Shell命令,因为PATH变量未指向正确的位置

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

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

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

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

第二个/var/www/html/dbsync用于什么?/var/www/html/dbsync-dbsync是保存index.php和dbsync.sh文件的目录。现在,我想每一秒都尝试一下。稍后,如果执行所需的结果,我将设置为每天午夜。您可以将所有这些命令放在另一个文件中,使其可执行为
chmod+x filename
,然后将该文件添加到crontab中吗?让我知道结果。您应该指定执行sh脚本的二进制文件-->
1****/bin/sh/var/www/html/dbsync/dbsync.sh/var/www/html/dbsync
或通过说出
which sh
得到的任何内容。谢谢@fedorqui这工作非常好,我会记住应该使用哪个程序来执行脚本。@sanainfotech欢迎:)您提供了很多详细信息,因此我试图使答案足够通用,以便在其他情况下用作参考。因为可以在crontab本身中设置
路径(即使在最初的条目中也没有,但在文件的顶部——任何
key=value
对都会自动导出到环境中),这个答案似乎没有明确讨论完成它命令的这种简单方法。