2011-10-10 88 views
2

我正在嘗試使用PHP向外部進程發送SIGHUP信號。目前,我做了以下內容:通過shell_exec通過PHP發送SIGHUP信號

$pid = shell_exec('ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\''); 
shell_exec('kill -s HUP $pid'); 

當我運行「PHP test.php的」命令行,我已經驗證信號被髮送到正確的過程,符合市場預期。

當我通過訪問http://foo.com/bar/test.php調用腳本時,不發送信號,shell_exec不返回任何內容。

爲了進行測試,我暫時以root權限運行PHP,但遇到同樣的問題,所以我認爲這不是一個權限問題。

有趣的是,了shell_exec返回輸出爲PWD命令和正常運行時間命令給瀏覽器,但不是LS命令。但是從命令行運行時,shell_exec通常會從ls返回輸出。

這些命令還有其他限制嗎?

此外,幾個音符:

  • 安全模式是關閉
  • 的error_reporting = E_ALL
  • 沒有功能是禁用
  • 我試圖明確指向二進制文件(防爆/斌/ PS和sh -c PS)
+0

我必須說這個問題被問到,+1 –

回答

2

嘗試

echo shell_exec('(ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\') 2>&1'); 

並查看是否有任何錯誤報告。此外,您可以嘗試pgrep,pkillkillall,而不是與psgrep混淆。

或者,您可以嘗試運行ps並自行解析其全部輸出。 (preg_match()和/或preg_grep()可能對此有用。) 而且您可以使用posix_kill()而不是運行外部kill程序。

編輯:根據意見,似乎實際的問題是一個缺失或不正確的設置PATH環境變量。解決此問題的一種方法是在shell中運行echo $PATH,複製輸出並將PATH設置爲PHP中的相同值putenv()。另一種解決方案是在shell中使用which來確定到達ps等的完整路徑。,並在shell_exec()中使用那些完整路徑。

+0

您的示例代碼輸出:** sh:ps:找不到sh:grep:找不到sh:grep:找不到**。我問了一個朋友,他說*/bin/sh -c ps *應該可以工作,但是類似地,返回:**/bin/sh:ls:找不到** – WilHall

+2

您的'PATH'環境變量可能在網絡服務器下運行時沒有(正確)設置。要麼是這樣,要麼就是在一些限制性的監獄中運行,它們根本不允許你訪問'ps'可執行文件。嘗試在shell中運行'which ps'來找出'ps'的完整路徑,看看是否有幫助。 –

+0

似乎是路徑。我修改了我的原始行來使用所有絕對路徑,它工作。然後,我決定使用pkill來代替 - 非常簡單。請在您的回答中添加PATH提及,並且我將其標記爲已接受。謝謝! – WilHall