2014-06-13 189 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 

然後我用中繼調用它。它的返回值參數然後被轉換爲布爾值,否定並由函數返回。

相關問題