当前位置: 首页 > 面试题库 >

PHP exec()返回后台进程的值(Linux)

蒋英博
2023-03-14
问题内容

我想在Linux上使用PHP,确定是否成功执行了使用exec()运行的shell命令。我正在使用return_var参数来检查成功的返回值0。这正常工作,直到我需要对必须在后台运行的进程执行相同的操作为止。例如,在以下命令中,$
result返回0:

exec('badcommand > /dev/null 2>&1 &', $output, $result);

我故意将重定向放在其中,我不想捕获任何输出。我只想知道命令已成功执行。那有可能吗?

谢谢,布莱恩


问题答案:

我的猜测是,您尝试做的事情不可能直接实现。通过使过程成为背景,可以让PHP脚本在结果存在之前继续运行(并可能退出)。

解决方法是拥有第二个PHP(或Bash / etc)脚本,该脚本仅执行命令并将结果写入临时文件。

主要脚本如下所示:

$resultFile = '/tmp/result001';
touch($resultFile);
exec('php command_runner.php '.escapeshellarg($resultFile).' > /dev/null 2>&1 &');

// do other stuff...

// Sometime later when you want to check the result...
while (!strlen(file_get_contents($resultFile))) {
    sleep(5);
}
$result = intval(file_get_contents($resultFile));
unlink($resultFile);

command_runner.php将如下所示:

$outputFile = $argv[0];
exec('badcommand > /dev/null 2>&1', $output, $result);
file_put_contents($outputFile, $result);

它不是很漂亮,当然还有增加健壮性和处理并发执行的空间,但是总体思路应该可行。



 类似资料:
  • 问题内容: 我正在尝试制作一个PHP脚本,我已经完成了脚本,但是大约要花10分钟才能完成它打算完成的过程。这不是问题,但是我想我必须一直保持页面加载,这很烦人。我可以使用它来启动该过程,然后在10分钟后再回来查看它生成的日志文件吗? 问题答案: 好吧,您可以使用“ ignore_user_abort(true)” 因此,脚本将继续起作用(注意脚本的持续时间,也许添加“set_time_limit(

  • 我是java和Android的新手。我正在尝试在Win7上使用android studio构建一个android浏览器。尝试构建我的应用程序时会出现以下错误: Android资源编译失败输出:C:\users\borinqueNatl\AndroidStudioProjects\browserexample\app\src\main\res\layout\activity_main.xml:34:

  • 我有一个Grails应用程序,我希望在应用程序启动后立即在后台运行一个线程,该线程查询数据库并获取结果集。此操作应每5分钟进行一次。 我搜索并发现grails的石英插件是最好的一个,但该插件在Grails run-app中工作,但在Tomcat中部署为战争时则不起作用。 除了quartz,还有其他插件可以做这个操作吗? 请给出一些建议。 提前感谢。

  • 问题内容: 我从shell脚本启动了一个后台进程,我想在脚本结束后终止该进程。 如何从我的shell脚本中获取此过程的PID?据我所知,变量包含当前脚本的PID,而不是后台进程。 问题答案: 您需要在启动时保存后台进程的PID: 您不能使用作业控制,因为它是一种交互式功能,并且与控制终端绑定在一起。脚本完全不必附加终端,因此作业控制不一定可用。

  • 问题内容: 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 问题答案: 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它将结果作为参数接收到的队列中。父母可以或愿意。 队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!

  • 问题内容: 在Python中,可以创建一个没有显式返回的过程。即: 此外,可以 将该 函数的结果 分配给 变量: 为什么会这样呢?令人困惑的设计决定背后是什么语言逻辑?为什么不简单地引发编译器错误? 编辑:是的,我意识到它可以那样工作。谢谢。我的问题是为什么?在您的代码中引入微妙的错误似乎是一种肯定的解雇方法。就像下面的e- satis提到的那样,这似乎与非常明智的python谚语相反,即“显露好