PHP`exec()`如果由从Cron

时间:2018-04-18 06:08:34

标签: php bash shell cron

我有一个Beanstalk MQ,其中我将任务创建为APK,以及一个名为AppBuilder.php的消费者,它从Beanstalk MQ读取消息,然后exec创建应用程序(Android应用程序)的命令。 / p>

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

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

    root 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& amp;',$ output,$ resultCode);

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

    我已关注this SO Post,并将exec命令修改为以下内容:

      

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

    然而,事情仍然失败。任何可能出错的线索?我花了很多时间挖掘论坛,没有人帮忙。请帮忙!

    编辑1:

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

    编辑2:

    我将crontab从root更改为ec2-user,如评论中所示:仍然无法运行该进程。

1 个答案:

答案 0 :(得分:0)

按照下面的第一种方法。但要解决此问题,您必须执行以下操作。

  1. 检查您的cron-tab条目是否正确设置。
  2. 在cron-tab中提供可执行文件的完整路径
  3. 检查cron-tab用户帐户是否具有正确的设置以执行sudo
  4. 检查cron-tab帐户是否具有执行PHP应用程序以及shell脚本的适当权限。如果没有将帐户添加到正确的组中,以便它可以运行PHP和shell脚本。

    exec('sudo sh /var/www/cgi-bin/appbuilder/oneClickApk.sh &', $output, $resultCode);
    
  5. 使用上面的命令似乎没问题。

    在你的shell脚本中输入一个wait命令并检查它是否正常工作。只需首先添加两行,而不添加任何if条件。如果工作,那么你需要根据你的要求检查你的条件是否满足。

    $PHP_CMD /opt/appbuilder/AppBuilder.php &
    while (( $(ps -ef | grep "[h]ealth-check.sh" | wc -l) <= 0 ))
    do
           sleep 5
    done
    sleep 30