2016-07-15 38 views
0

我試圖圍繞Linux屏幕實用程序創建一個PHP包裝類。 我需要能夠按名稱啓動屏幕會話並獲取創建的屏幕的PID。創建Linux屏幕會話,並得到它的PID

我不能假設會話名稱是唯一的所以它不能解析session -ls輸出找到PID。

基於互聯網附近的實例和建議,我一直在使用PHP的exec()功能嘗試以下方法:

screen -D -m -S 'screen_name' 2>&1 & 

-D參數告訴屏無法派生進程,因此它具有相同的PID爲後臺進程。

所以,那麼我可以從&背景殼操作者這是在這個格式的輸出解析PID:

在Linux shell本命令(立即終止),但是當我運行它從PHP中凍結並且瀏覽器從不加載頁面。

我試着用PHP的exec()和shell_exec()來執行它,它的結果是一樣的。

我也嘗試了許多不同的命令的最後部分,如HERE描述的組合。

編輯:

如果我使用這個命令:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & 2>&1 

然後PHP exec()作品。它開始屏幕會話,但是我沒有從&背景算子得到任何輸出。我假設這是因爲我將stdoutstderr重定向到/dev/null,但據我所知,它應該只對屏幕命令執行此操作,而不是&操作員。

概SOLUTION:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $! 

我意識到,在從&背景操作者的終端顯示文本實際上並沒有從命令stdout或stderr到來。它是顯示它的殼。所以我在&運算符之後加上echo $!,它將打印最後一個命令創建的進程的PID。

這在終端工作,它打印正確的PID。但是當它在PHP中執行時,實際的屏幕PID值比echo返回的值多4。 這就像在&運算符之前正在執行回聲。有什麼辦法讓它等待?

SOLUTION:

我在須藤包裝命令,背景運算符作用於sudo命令而不是屏幕命令。確保你逃脫你的命令參數! :)

+0

當然PHP將凍結。你做了一個'exec'調用,這個調用會阻止你運行的外部應用程序退出。屏幕從不退出/返回,因爲你告訴它保持連接/運行,所以你的整個PHP腳本凍結等待exec()返回,並且它永遠不會返回,直到屏幕退出/分離。 –

+0

這不是'-D'參數的含義。它告訴'screen'分離一箇舊的屏幕會話。 – Barmar

+0

@MarcB但是他用'&'在後臺運行它,所以shell應該立即退出而不等待命令完成。 – Barmar

回答

0

概SOLUTION:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $! 

我意識到,在從&背景操作者終端中的文本表示實際上並沒有從命令stdout或stderr到來。它是顯示它的殼。所以我在&運算符之後加上echo $!,它將打印最後一個命令創建的進程的PID。

這在終端工作,它打印正確的PID。但是當它在PHP中執行時,實際的屏幕PID值比echo返回的值多4。 這就像在&運算符之前正在執行回聲。有什麼辦法讓它等待?

SOLUTION:

我在須藤包裝命令,背景運算符作用於sudo命令而不是屏幕命令。確保你逃脫你的命令參數! :)

- 布拉德利敖德爾