2009-11-10 87 views
13

通過我的Web界面,我想啓動/停止某些進程並確定啓動的進程是否仍在運行。用於Linux進程管理的Python庫

我現有的網站是基於Python並運行在Linux服務器上的,所以你知道一個合適的庫支持這個功能嗎?

謝謝

回答

13

啓動/停止蟒子流程,您可以使用子模塊。 要檢查它們是否正在運行您可以使用psutil

>>> import psutil 
>>> pid = 1034 # some pid 
>>> psutil.pid_exists(pid) 
True 
>>> 

...或者這個(它也將檢查PID已經被重複使用):

>>> p = psutil.Process(pid) 
>>> p.is_running() 
True 
>>> 
1

os模塊可能是你的朋友。有os.kill,例如殺死一個進程。

就獲取進程列表而言,您可能需要剔除ps命令。 This question有更多的信息。

+0

是啊,我以後最好比手動解析PS – hoju 2009-11-10 01:43:15

+2

運行殼內'ps'命令一個更高的層次庫是一個很多比約使用/ proc tylerl注更危險。相反。 – 2009-11-10 01:43:34

+0

它怎麼會危險? – hoju 2009-11-10 01:44:41

6

通過查看/ proc目錄的內容來檢查正在運行的進程列表(即使是像「ps」這樣的核心實用程序)。

這樣,當用於與任何其他文件和目錄(即sysos工作,這取決於你的後味,你有興趣查詢正在運行的進程庫是一樣的。要特別注意os.path不過,它會完成大部分的工作)。要終止或以其他方式與進程進行交互,請發送它們的信號,這些信號通過os.kill完成。最後,你開始使用os.popen和朋友的新流程。

2

既然你說這是一臺Linux服務器,調用外部PS二進制通常比較慢,使用更多的資源,更錯誤不是使用/直接PROC的信息容易。

既然誰也提到,一個簡單的方法是:

glob.glob('/proc/[0-9]*/') 

好運。

2

這就是我使用的。它使用procfs(所以你只限於Unix系統,不會在我認爲的mac上工作)和前面提到的glob。它也得到了cmdline,它可以讓你識別這個過程。爲了殺死這個過程,你可以使用os.kill(signal.SIGTERM, pid)。對於使用子進程,請查看這篇文章Python, Popen and select - waiting for a process to terminate or a timeout

def list_processes(): 
    """ 
    This function will return an iterator with the process pid/cmdline tuple 

    :return: pid, cmdline tuple via iterator 
    :rtype: iterator 

    >>> for procs in list_processes(): 
    >>>  print procs 
    ('5593', '/usr/lib/mozilla/kmozillahelper') 
    ('6353', 'pickup -l -t fifo -u') 
    ('6640', 'kdeinit4: konsole [kdeinit]') 
    ('6643', '/bin/bash') 
    ('7451', '/usr/bin/python /usr/bin/ipython') 
    """ 
    for pid_path in glob.glob('/proc/[0-9]*/'): 

     # cmdline represents the command whith which the process was started 
     f = open("%s/cmdline" % pid_path) 
     pid = pid_path.split("/")[2] # get the PID 
     # we replace the \x00 to spaces to make a prettier output from kernel 
     cmdline = f.read().replace("\x00", " ").rstrip() 
     f.close() 

     yield (pid, cmdline) 
0

我會用PSutil。以提供一個實際的例子:

import psutil 

for proc in psutil.get_process_list(): 
    if proc.username == 'yourusername': 
     if myappname in proc.cmdline: 
      print 'App is running' 

或者,紅帽使用和維護稱爲蟒-Linux的PROCFS一個Python模塊,其中本地解析/ PROC,管理進程。它不是很好公開,但提供了一些額外的Linux特有的功能(例如,調度類),有時是有用的。

http://pkgs.fedoraproject.org/gitweb/?p=python-linux-procfs.git