我試圖圍繞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()
作品。它開始屏幕會話,但是我沒有從&
背景算子得到任何輸出。我假設這是因爲我將stdout
和stderr
重定向到/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命令而不是屏幕命令。確保你逃脫你的命令參數! :)
當然PHP將凍結。你做了一個'exec'調用,這個調用會阻止你運行的外部應用程序退出。屏幕從不退出/返回,因爲你告訴它保持連接/運行,所以你的整個PHP腳本凍結等待exec()返回,並且它永遠不會返回,直到屏幕退出/分離。 –
這不是'-D'參數的含義。它告訴'screen'分離一箇舊的屏幕會話。 – Barmar
@MarcB但是他用'&'在後臺運行它,所以shell應該立即退出而不等待命令完成。 – Barmar