在Linux環境下,我想使用Python來啓動一個守護進程,如果它沒有啓動,得到了PID,然後在某個時刻稍後使用os.kill(pid,signel.SIGTERM)殺死該進程。這會導致守護進程失效,如果它是從我的腳本啓動的。從Python腳本中啓動的守護進程,並通過os.kill殺死它後
這裏的示例代碼:
#!/usr/bin/env python3
import os, subprocess, time, signal, getpass
p = subprocess.Popen(['sleep', '30'])
os.kill(int(p.pid), signal.SIGTERM)
os.system('ps -fu ' + getpass.getuser())
我得到以下的輸出:
UID PID PPID C STIME TTY TIME CMD
pchernik 7179 10629 0 16:07 pts/0 00:00:00 python3 ./boom
pchernik 7180 7179 0 16:07 ? 00:00:00 [sleep] <defunct>
我的最終目標是:
- 使用.pid文件檢查服務是否運行
- 啓動後臺程序如果沒有運行,則獲取PID並將其保存到.pid文件
- 做一些其他的東西(與守護套接字通信)
- 停止守護進程,並再次使用os.kill(PID,signal.SIGTERM)
不能使用p.kill()b啓動它/ c如果進程已經在這個python腳本之外啓動,我可能沒有「p」來處理。
無法使用wait(),因爲我有超過1個進程以此方式啓動。
我嘗試添加preexec_fn = os.setsid到POPEN - 似乎並沒有幫助
如何從Python腳本中啓動的守護進程,並完全從我的Python進程分離呢?
感謝, -Pavel
愚蠢的問題,但爲什麼你不讓初始化/新貴/ systemd(戰慄)照顧的細節問題,而讓操作系統提供的工具處理這個的嗎? – tink 2015-02-11 21:47:21
這是一個更大的腳本,我把一起做類似下面的第三方軟件包,有守護進程在幾個開發環境下運行的一部分: *開始幾個守護進程,如果它們尚未啓動 *做一些其他的東西,與這些進程通信 *在這個「其他的東西」期間 - 一些守護進程將不得不重新啓動,多次,使更改生效。 – 2015-02-11 21:49:37
I.e.我有一些開發人員使用這個工具,它需要幾個守護進程在個別的開發環境下運行。 – 2015-02-11 21:56:26