如何在Unix或Linux中使用Python获取程序的进程ID?
我正在用Python编写一些监控脚本,我试图find最简洁的方法来获得任何随机运行程序的进程ID给定的程序的名称
就像是
ps -ef | grep MyProgram
我可以parsing的输出,但我认为可能是一个更好的方式在Python中
尝试pgrep
。 它的输出格式更简单,因此更容易parsing。
从标准库 :
os.getpid()
如果你不限制自己的标准库,我喜欢这个psutil 。
另外: Python:如何通过进程名获得PID?
适应以前发布的答案。
def getpid(process_name): import os return [item.split()[1] for item in os.popen('tasklist').read().splitlines()[4:] if process_name in item.split()] getpid('cmd.exe') ['6560', '3244', '9024', '4828']
对于Windows
在不下载任何模块的情况下获取计算机上所有程序的pid的方法:
import os pids = [] a = os.popen("tasklist").readlines() for x in a: try: pids.append(int(x[29:34])) except: pass for each in pids: print(each)
如果你只是想要一个程序或所有程序具有相同的名称,你想杀死进程或什么的:
import os, sys, win32api tasklistrl = os.popen("tasklist").readlines() tasklistr = os.popen("tasklist").read() print(tasklistr) def kill(process): process_exists_forsure = False gotpid = False for examine in tasklistrl: if process == examine[0:len(process)]: process_exists_forsure = True if process_exists_forsure: print("That process exists.") else: print("That process does not exist.") raw_input() sys.exit() for getpid in tasklistrl: if process == getpid[0:len(process)]: pid = int(getpid[29:34]) gotpid = True try: handle = win32api.OpenProcess(1, False, pid) win32api.TerminateProcess(handle, 0) win32api.CloseHandle(handle) print("Successfully killed process %s on pid %d." % (getpid[0:len(prompt)], pid)) except win32api.error as err: print(err) raw_input() sys.exit() if not gotpid: print("Could not get process pid.") raw_input() sys.exit() raw_input() sys.exit() prompt = raw_input("Which process would you like to kill? ") kill(prompt)
这只是我的进程kill程序的粘贴,我可以做得更好,但没关系。
对于POSIX(Linux,BSD等…只需要安装/ proc目录),在/ proc中使用os文件更容易
在Python 2和3上工作(唯一的区别是exception树,因此“ 除了exception ”,我不喜欢,但保持兼容性,也可以创build自定义exception。
#!/usr/bin/env python import os import sys for dirname in os.listdir('/proc'): if dirname == 'curproc': continue try: with open('/proc/{}/cmdline'.format(dirname), mode='rb') as fd: content = fd.read().decode().split('\x00') except Exception: continue for i in sys.argv[1:]: if i in content[0]: # dirname is also the number of PID print('{0:<12} : {1}'.format(dirname, ' '.join(content)))
示例输出(它像pgrep一样工作):
phoemur ~/python $ ./pgrep.py bash 1487 : -bash 1779 : /bin/bash
任务可以使用下面的代码来解决,[0:28]是名字被保留的区间,而[29:34]则包含实际的pid。
import os program_pid = 0 program_name = "notepad.exe" task_manager_lines = os.popen("tasklist").readlines() for line in task_manager_lines: try: if str(line[0:28]) == program_name + (28 - len(program_name) * ' ': #so it includes the whitespaces program_pid = int(line[29:34]) break except: pass print(program_pid)