2014-07-12 150 views
0

我的目標是能夠在單獨的進程中啓動shell腳本,並通過linux ptrace syscall來檢查它。 問題是我需要在啓動之前獲得過程PID。像subprocess.Popen(['ls','-l'])或python-sh這樣的東西立即運行命令,所以我試圖通過它的PID來檢查這個進程,它可能會結束。 另一方面,我不能使用os.fork + exec,因爲bash命令我開始重寫python代碼。python subprocess popen立即啓動

+0

不明白,爲什麼你不能使用fork + exec,因爲子進程在內部使用它。 – Daniel

+0

在分叉進程中的執行python死去給新的代碼活(例如shell腳本)。 –

+0

所以,因爲我做os.fork我只能執行python直到執行命令。有沒有辦法在孩子中執行bash,然後立即回到父母身上並在孩子pid上運行一些功能? –

回答

3

如果您使用的是Unix,我認爲您可以在Popen構造函數中使用preexec_fn參數。

根據子的文檔:

如果preexec_fn設置爲可調用對象,這個對象將在執行子之前的子進程調用。 (僅適用於Unix)

由於它在子進程中運行,因此可以使用os.getpid()來獲取子pid。

2

只是叉子和你打電話ptrace()PTRACE_TRACEME外殼Exec之前使該執行不會立即啓動,給父母都需要準備它告訴孩子繼續(PTRACE_CONTPTRACE_SYSCALL,或PTRACE_SINGLESTEP前的時間)。

使用subprocess.Popen()時,您可以使用@RuiSilva提到的preexec_fn參數來執行PTRACE_TRACEME調用。