最近有一个需求,需要对后台通过终端(windows和linux)启动的进程进行生命周期的管理,现将方法总结如下:
通过psutil杀死父进程及相关子进程
p = psutil.Process(pid)
p_childs = p.children(recursive=True)
for p_child in p_childs:
logger.debug("kill child pro: {}".format(p_child.pid))
p_child.terminate()
p_child.status() # 查看进程状态
pyutil 进程其他操作
p = psutil.Process(pid)
p.name() # 进程名称
'python3.6'
>>> p.exe() # 进程exe路径
'/Users/sm/anaconda3/bin/python3.6'
>>> p.cwd() # 进程工作目录
'/Users/sm'
>>> p.cmdline() # 进程启动的命令行
['python3']
>>> p.ppid() # 父进程ID
3765
>>> p.parent() # 父进程
<psutil.Process(pid=110, name='bash') at 12345678910>
>>> p.children() # 子进程列表
[]
>>> p.status() # 进程状态
'running'
>>> p.username() # 进程用户名
'michael'
>>> p.create_time() # 进程创建时间
1511052731.120333
>>> p.terminal() # 进程终端
'/dev/ttys002'
>>> p.cpu_times() # 进程使用的CPU时间
pcputimes(user=0.081150144, system=0.053269812, children_user=0.0, children_system=0.0)
>>> p.memory_info() # 进程使用的内存
pmem(rss=8310784, vms=2481725440, pfaults=3207, pageins=18)
>>> p.open_files() # 进程打开的文件
[]
>>> p.connections() # 进程相关网络连接
[]
>>> p.num_threads() # 进程的线程数量
1
>>> p.threads() # 所有线程信息
[pthread(id=1, user_time=0.090318, system_time=0.062736)]
>>> p.environ() # 进程环境变量
{'SHELL': '/bin/bash', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...', 'PWD': '/Users/michael', 'LANG': 'zh_CN.UTF-8', ...}
>>> p.terminate() # 结束进程
命令行进程退出(linux)
os.killpg(pro.pid, signal.SIGUSR1) # 信号量也可以使用signal.SIGUSR2
命令行进程退出(windows)
因为window对信号量支持不是很多,所以不能使用signal.SIGUSR1退出进程。
'taskkill.exe /pid {} /f'.format(str(pid))
# 或
'taskkill /F /IM {}'.format('python.exe')
或
if hasattr(os.sys, 'winver'):
os.kill(pro.pid, signal.CTRL_BREAK_EVENT)
else:
pro.send_signal(signal.SIGTERM)
参考文献
https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984