我正在开发一个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
真的无法弄清楚这笔交易是什么......
答案 0 :(得分:0)
命令返回什么:0还是NULL?在第二种情况下,命令可能完全失败。您可以使用exec function查看是否获得非零退出代码。在这种情况下,请确保在命令前添加/bin/sh -c
。
答案 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,并由函数返回。
〜