首页 文章

如果由Cron启动的进程运行,PHP`exec()`不起作用

提问于
浏览
-1

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

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

  • Crontab运行health-check.sh shell脚本

  • health-check.sh在后台运行AppBuilder.php

  • AppBuilder.php调用 exec 来创建进程

以下是每个文件的相关代码段:

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

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

编辑1:

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

编辑2:

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

1 回答

  • 0

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

    • 检查您的cron-tab条目是否正确设置 .

    • 在cron-tab中提供可执行文件的完整路径

    • 检查cron-tab用户帐户是否具有正确的设置以执行 sudo

    • 检查cron-tab帐户是否具有执行PHP应用程序和shell脚本的适当权限 . 如果没有将帐户添加到正确的组中,以便它可以运行PHP和shell脚本 .

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

    使用上面的命令它似乎没问题 .

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

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

相关问题