shell_exec没有返回与sudoed命令行相同的结果

时间:2014-06-13 21:51:36

标签: php linux shell

我正在开发一个PHP-FPM驱动模块,在其中上传视频,然后使用ffmpeg将它们转码为几种HTML5格式。此PHP-FPM脚本在特定的非根UID下运行,称为tv25。

我可以通过Streaming Server(Wowza)录制网络摄像头流,该流在根UID下运行,并通过Java编写的模块启动转换。

为了知道进程的状态,我向运行以下函数的脚本发出GET请求:

function is_conversion_running($base_file_name) {
  $command = "sudo ps aux | grep {$base_file_name} | grep -v grep | wc -l";
  $lignes  = shell_exec($command);
  return (bool) $lignes;
}

当我通过AJAX调用此函数时,它适用于PHP-FPM变体(UID是相同的,在转换运行时返回true),但不适用于Wowza变体(每次都返回false)。

奇怪的是,如果我在shell中运行命令,使用非根UID,它就像魅力一样,因为ps命令已被允许由此UID运行。

问题似乎与shell_exec returns empty string中的问题类似,但其中列出的解决方案对我不起作用。

我的/ etc / sudoers行是这样的:

tv25  ALL = (root)  NOPASSWD: /bin/ps

真的无法弄清楚这笔交易是什么......

2 个答案:

答案 0 :(得分:0)

命令返回什么:0还是NULL?在第二种情况下,命令可能完全失败。您可以使用exec function查看是否获得非零退出代码。在这种情况下,请确保在命令前添加/bin/sh -c

PS:你真的需要sudo来运行ps吗?通常,即使没有sudo,您也可以获得所有流程。

答案 1 :(得分:0)

我找到了解决问题的另一种方法:因为我想知道进程是否仍在运行,我将命令委托给shell脚本:

#!/bin/bash

BASE_NAME=`basename $0`
LIGNES=$(/usr/bin/sudo /bin/ps aux | grep "$1" | grep -v grep | grep -v $BASE_NAME | wc -l)

[ $LIGNES -eq "0" ] && exit 1
exit 0

然后我用passthru称呼它。然后它的返回值参数被转换为boolean,negated,并由函数返回。