我用Python寫一些監視腳本,我試圖找到讓因爲程序的名稱如何在Unix或Linux中使用Python獲取程序的進程ID?
像
ps -ef | grep MyProgram
任何隨機正在運行的程序的進程ID最徹底的方法我可以解析,它的輸出,但是我覺得有可能是蟒蛇有更好的方式
我用Python寫一些監視腳本,我試圖找到讓因爲程序的名稱如何在Unix或Linux中使用Python獲取程序的進程ID?
像
ps -ef | grep MyProgram
任何隨機正在運行的程序的進程ID最徹底的方法我可以解析,它的輸出,但是我覺得有可能是蟒蛇有更好的方式
嘗試pgrep
。它的輸出格式更簡單,因此更易於解析。
os.getpid()
如果你不想限制自己的標準庫,我喜歡psutil。
例如找到所有的 「蟒蛇」 的過程:
>>> import psutil
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']]
[{'name': 'python3', 'pid': 21947},
{'name': 'python', 'pid': 23835}]
你能否提供一個相同的例子。 – 2017-05-03 09:29:54
缺乏示例 – Paullo 2018-01-20 09:37:00
對於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程序的貼我可以使它好多了,但它是好的。
該任務可以使用下面的一段代碼來解決,[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)
另外: Python: How to get PID by process name?
適應以前發佈的答案。
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']
對於POSIX(Linux操作系統,BSD等..只需要安裝/ proc目錄)更容易在/ proc
作品在Python 2和3操作系統文件的工作(唯一的不同之處在於異常樹,因此「除外例」,我不喜歡但保持兼容性。也可以創建自定義異常。)
#!/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)))
樣本輸出(它的工作原理是p纖ep):
phoemur ~/python $ ./pgrep.py bash
1487 : -bash
1779 : /bin/bash
隨着psutil
:
(可以用[sudo] pip install psutil
安裝)
import psutil
# Get current process pid
current_process_pid = psutil.Process().pid
print(current_process_pid) # e.g 12971
# Get pids by program name
program_name = 'chrome'
process_pids = [process.pid for process in psutil.process_iter() if process.name == program_name]
print(process_pids) # e.g [1059, 2343, ..., ..., 9645]
如果你想進行跨領域平臺(例如Linux,Mac,Solaris等),沒有比解析「pf」輸出更好的方法。如果是針對單個非常特定的平臺,請編輯您的Q以添加明顯至關重要的信息(確切的操作系統版本,您需要定位)*和*標籤! – 2010-09-21 15:08:24
你可以直接用python解析ps的輸出 – Mark 2010-09-21 15:10:32