【发布时间】:2010-12-14 20:58:21
【问题描述】:
通过我的网络界面,我想启动/停止某些进程并确定启动的进程是否仍在运行。
我现有的网站是基于 Python 并在 Linux 服务器上运行的,那么您知道支持此功能的合适库吗?
谢谢
【问题讨论】:
通过我的网络界面,我想启动/停止某些进程并确定启动的进程是否仍在运行。
我现有的网站是基于 Python 并在 Linux 服务器上运行的,那么您知道支持此功能的合适库吗?
谢谢
【问题讨论】:
os 模块可能是你的朋友。还有os.kill,比如杀死一个进程。
在获取进程列表方面,您可能需要使用ps 命令。 This question 有更多相关信息。
【讨论】:
ps 命令比 tylerl 关于使用 /proc 的说明危险得多。改为这样做。
ps 命令。然后你想你想传递一些开关给它。然后可能是用户提供的过滤器字符串,然后你就有了一个根网络服务器。此外,它鼓励使用有同样问题的kill。
检查正在运行的进程列表是通过查看 /proc 目录的内容来完成的(即使是通过诸如“ps”之类的核心实用程序)。
因此,您对查询正在运行的进程感兴趣的库与用于处理任何其他文件和目录的库相同(即sys 或os,具体取决于您所追求的风格。支付特殊费用不过请注意os.path,它可以完成您所追求的大部分工作)。要终止进程或以其他方式与进程交互,您可以向它们发送信号,这是通过os.kill 完成的。最后,您使用os.popen 和朋友启动新进程。
【讨论】:
Python 子进程 http://docs.python.org/library/subprocess.html 可能会对您有所帮助。如果使用子进程创建进程,则可以使用 Popen.terminate() 函数来停止它。
【讨论】:
既然你说这是一个 Linux 服务器,调用外部 ps 二进制文件通常比使用来自 /proc 的信息更慢、使用更多资源并且更容易出错直接。
由于没有其他人提及,一种简单的方法是:
glob.glob('/proc/[0-9]*/')
祝你好运。
【讨论】:
这就是我使用的。它使用 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)
【讨论】:
要启动/停止 python 子进程,您可以使用 subprocess 模块。 要检查它们是否正在运行,您可以使用psutil:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...或者这个(它还会检查 PID 是否被重用):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
【讨论】:
我会使用 PSutil。举个实际例子:
import psutil
for proc in psutil.get_process_list():
if proc.username == 'yourusername':
if myappname in proc.cmdline:
print 'App is running'
另外,Red Hat 使用并维护一个名为 python-linux-procfs 的 Python 模块,该模块本机解析 /proc 来管理进程。它没有得到很好的宣传,但提供了一些额外的 Linux 特定功能(例如调度类),这些功能有时很有用。
http://pkgs.fedoraproject.org/gitweb/?p=python-linux-procfs.git
【讨论】:
探索Supervisor,这是一个基于 Python 的 Linux 过程控制系统。它提供了一个基于 Web 的 UI,可以在崩溃时自动检查进程状态/启动/停止/重新启动。 还有superlance 插件可用,您可以在其中发送邮件以防进程崩溃。
【讨论】: