2014-06-13 149 views
0

我正在开发一个PHP-FPM驱动的模块,其中在上传视频时,使用ffmpeg将它们转换为背景中的多个HTML5格式。这个PHP-FPM脚本在特定的非根UID下运行,称为tv25。shell_exec不会返回与sudoed命令行相同的结果

有一个变种,我通过在根UID下运行的Streaming Server(Wowza)记录网络摄像头流,并通过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中使用非root UID运行该命令,它就像一个魅力一样工作,因为ps命令已被允许由此UID运行。

该问题与shell_exec returns empty string中的问题类似,但列出的解决方案对我无效。

我的/ etc/sudoers的线路是这样的:

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

实在无法弄清楚什么是交易...

回答

0

什么命令返回:0或NULL?在第二种情况下,命令可能全部失败。你可以用exec function查询你是否得到一个非零的退出码。在这种情况下,请确保以/bin/sh -c为前缀。

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

+0

该命令返回1.我不得不sudo ps,因为如果没有,以root身份启动的进程不会出现。 – jpicaude

0

好吧,我发现了另一种方式来sikve我的问题:因为我想知道,如果进程仍在运行,我在一个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 

然后我用中继调用它。它的返回值参数然后被转换为布尔值,否定并由函数返回。

相关问题