簡體   English   中英

子流程開始兩個流程而不是一個

[英]Subprocess starting two processes instead of one

我正在使用子流程啟動一個流程,並使其在后台運行,這是一個服務器應用程序。 進程本身是帶有瘦包裝器的Java程序(除其他外,這意味着我可以將其作為可執行文件啟動,而不必顯式調用Java)。

我正在使用Popen運行該進程,當我設置shell = False時,它會運行,但會生成兩個進程而不是一個。 第一個進程將init作為其父進程,當我通過ps檢查它時,它僅顯示raw命令。 但是,第二個進程顯示帶有擴展的Java參數(-D和-X標志)-這是我期望看到的,以及當我手動運行命令時該進程的外觀。

有趣的是,當我設置shell = True時,命令失敗。 該命令確實有一條幫助消息,但似乎並不表明我的參數列表有問題(不應存在)。 除了Popen的名為shell的參數外,其他所有內容都相同。 我在Ubuntu上使用Python 2.7。 不太確定這里發生了什么,我們將不勝感激。 我想java命令可能正在執行exec / fork,由於某種原因,當我通過Python啟動它時,父進程並沒有死。

我看到了這樣的問題 ,它看起來很有希望,但不會改變我所遇到的行為。

實際上,這更多是關於包裝器的問題,而不是關於Python的問題-從任何其他語言運行它,您都會得到相同的行為。

為了獲得所需的行為,包裝器將需要在其中調用JVM的行如下所示:

exec java -D... -cp ... main.class.here "$@"

...而不是前面缺少exec

java -D... -cp ... main.class.here "$@"

在前一種情況下,包裝程序的過程映像將替換為其調用的JVM的過程映像。 在后者中,包裝程序等待JVM退出,然后繼續運行。

如果包裝器在JVM退出后進行了任何清理,則使用exec可以防止這種情況的發生,因此可能是錯誤的事情-在這種情況下,您希望包裝器在JVM運行時仍然存在,否則它將無法之后執行清理。

請注意,如果包裝程序負責分離子進程,則它必須能夠關閉打開的文件句柄才能正確發生。 如果您的父進程具有比打開stdin,stdout和stderr更多的文件描述符,請考慮將close_fds=True傳遞給close_fds=True調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM