PHP`exec()`不';如果由Cron启动的进程运行,则无法工作

PHP`exec()`不';如果由Cron启动的进程运行,则无法工作,php,bash,shell,cron,Php,Bash,Shell,Cron,我有一个Beanstalk MQ,我把任务放在其中创建APK,还有一个名为AppBuilder.php的使用者,它从Beanstalk MQ读取消息,然后是exec创建应用程序的命令(android应用程序) AppBuilder.php是从crontab运行的。过程是 Crontab运行health-check.sh shell脚本 health-check.sh在后台运行AppBuilder.php AppBuilder.php调用exec来创建流程 以下是每个文件中的相关代码段: 根cro

我有一个Beanstalk MQ,我把任务放在其中创建APK,还有一个名为AppBuilder.php的使用者,它从Beanstalk MQ读取消息,然后是
exec
创建应用程序的命令(android应用程序)

AppBuilder.php是从crontab运行的。过程是

  • Crontab运行health-check.sh shell脚本
  • health-check.sh在后台运行AppBuilder.php
  • AppBuilder.php调用
    exec
    来创建流程
  • 以下是每个文件中的相关代码段:

    根crontab如下所示:

    * * * * * /opt/cron/health-check/health-check.sh
    
    health-check.sh是这样的:

    #!/bin/bash
    PATH=$PATH:/sbin/
    
    #HEALTH CHECK FOR AppBuilder Daemon
    if (( $(ps -ef | grep "[A]ppBuilder" | wc -l) > 0 ))
    then
    echo "AppBuilder is Running" 
    else
    echo "AppBuilder is Stopped, attempting to restart" 
    $PHP_CMD /opt/appbuilder/AppBuilder.php &
    if pgrep "AppBuilder" > /dev/null
    then
    echo "AppBuilder is now Running"
    else
    echo "AppBuilder is still not Running"
    fi
    fi
    
    AppBuilder.php具有以下exec命令:

    exec('sudo sh/var/www/cgi-bin/appbuilder/oneClickApk.sh&',$output,$resultCode)

    如果我直接运行AppBuilder.php,一切正常。但是,从cron来看,它不是

    我遵循了,并将exec命令修改为:

    exec('/usr/bin/nohup/usr/bin/sudo/usr/bin/env TERM=xterm/bin/sh/var/www/cgi-bin/appbuilder/oneClickApk.sh&',$output,$resultCode)

    然而,事情还是失败了。有任何线索表明这可能会出错吗?我花了很多时间挖掘论坛,一点帮助都没有。请帮忙

    编辑1:

    crontab运行,AppBuilder.php被初始化,但是在exec命令之后,我在进程列表中看不到oneClickApk.sh

    编辑2:


    我将crontab从root用户更改为ec2用户,正如注释中所建议的那样:进程仍然没有运行。

    只需遵循下面的第一种方法即可。但要解决这个问题,您必须执行以下操作

  • 检查cron选项卡条目是否设置正确
  • 在cron选项卡中,提供可执行文件的完整路径
  • 检查cron tab用户帐户是否具有执行
    sudo
  • 检查cron选项卡帐户是否具有执行PHP应用程序和shell脚本的适当权限。如果没有,请将帐户添加到适当的组中,以便它可以同时运行PHP和shell脚本

    exec('sudo sh /var/www/cgi-bin/appbuilder/oneClickApk.sh &', $output, $resultCode);
    
  • 使用上面的命令似乎可以

    在shell脚本中,放置一个wait命令并检查它是否工作正常。只需在不带任何
    条件的前提下添加两行即可。如果工作,那么你需要检查你的条件,如果他们不符合你的要求

    $PHP_CMD /opt/appbuilder/AppBuilder.php &
    while (( $(ps -ef | grep "[h]ealth-check.sh" | wc -l) <= 0 ))
    do
           sleep 5
    done
    sleep 30
    
    $PHP\u CMD/opt/appbuilder/appbuilder.PHP&
    
    虽然($(ps-ef | grep“[h]ealth check.sh”| wc-l)尝试添加
    /bin/sh
    ,(例如
    /bin/sh/opt/cron/health check/health check.sh
    )不起作用。您能告诉我为什么建议这样做吗?因为
    /opt/cron/health check/health check.sh
    不是有效的命令(尝试一下,它可能会返回未找到的命令).Cron在没有有效命令的情况下不知道该做什么。因此,放置
    /bin/sh
    sh
    或者甚至执行
    /opt/Cron/health check/health check.sh
    应该可以正确运行该命令。它的可执行文件,因此它可以运行ls-la/opt/Cron/health check/health-check.sh-rwxrwxr-x 1 ec2用户ec2用户4346 Apr 17 12:11/opt/Cron/health check/health check.sh这很好,但是如果不在它前面放一个命令,它仍然无法执行。为什么从shell运行AppBuilder.php会起作用,但从crontab运行同样的事情不会起作用(现在,crontab是从同一个linux用户-ec2用户运行的)?正如我在回答中所说的,您是否检查了是否提供了像
    /app/php/AppBuilder.php那样的完整路径?像这样的完整路径在哪里?我已经修改了我的答案。请查看最后一个选项,然后先做一个测试。有了这个“等待”,它就工作了。但是,当我停止新创建的包含等待的脚本时,exec进程也停止了