2015-02-11 90 views
0

在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

+0

愚蠢的問題,但爲什麼你不讓初始化/新貴/ systemd(戰慄)照顧的細節問題,而讓操作系統提供的工具處理這個的嗎? – tink 2015-02-11 21:47:21

+0

這是一個更大的腳本,我把一起做類似下面的第三方軟件包,有守護進程在幾個開發環境下運行的一部分: *開始幾個守護進程,如果它們尚未啓動 *做一些其他的東西,與這些進程通信 *在這個「其他的東西」期間 - 一些守護進程將不得不重新啓動,多次,使更改生效。 – 2015-02-11 21:49:37

+0

I.e.我有一些開發人員使用這個工具,它需要幾個守護進程在個別的開發環境下運行。 – 2015-02-11 21:56:26

回答

0

不要重複。重用:https://pypi.python.org/pypi/daemonize

順便說一句,你可以修改你的守護說話的協議?如果是的話,你可以添加一個「終止你自己」的命令到協議。這比「os.kill()」更清潔。

如果你的守護程序不是用Python寫,你可以使用子或os.execv啓動可執行文件(與守護進程一起)。

+0

謝謝,現在就試試這個。守護進程是一個3P工具,所以不能修改協議。 – 2015-02-11 21:27:41

+0

我不認爲我可以使用deamonize,因爲它旨在創建一個python守護進程,而不是啓動另一個可執行文件作爲後臺進程。它存儲在.pid文件中的pid是分叉的python進程的pid。 – 2015-02-11 21:34:52

+0

@PavelChernikov我更新了答案:如果你的守護進程不是用Python編寫的,你可以使用子進程或os.execv來啓動可執行文件(和daemonize一起使用) – guettli 2015-02-12 08:26:29

0

看起來像什麼,我需要做的就是調用os.waitpid()的過程中發出後殺。這個過程不再失效並且消失了。