如何通过Python查找进程的pid?
朋友们: 我正在Linux中运行一个脚本: 我可以使用如何通过Python查找进程的pid?,python,pid,Python,Pid,朋友们: 我正在Linux中运行一个脚本: 我可以使用ps命令获取进程 ps -ef | grep "python test09.py&" 但是,通过给定关键字pythontest09.py&使用python代码,我如何知道运行脚本的pid EDIT-01 我的意思是,我想使用python脚本查找正在运行的脚本python test09.py&的pid EDIT-02 当我运行anali的方法时,会出现以下错误: Traceback (most recent c
ps
命令获取进程
ps -ef | grep "python test09.py&"
但是,通过给定关键字pythontest09.py&
使用python代码,我如何知道运行脚本的pid
EDIT-01 我的意思是,我想使用python脚本查找正在运行的脚本
python test09.py&
的pid
EDIT-02 当我运行anali的方法时,会出现以下错误:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 363, in catch_zombie
yield
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 429, in cmdline
return cext.proc_cmdline(self.pid)
ProcessLookupError: [Errno 3] No such process (originated from sysctl)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test11.py", line 29, in <module>
print(get_pids_by_script_name('test09.py'))
File "test11.py", line 15, in get_pids_by_script_name
cmdline = proc.cmdline()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/__init__.py", line 694, in cmdline
return self._proc.cmdline()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 342, in wrapper
return fun(self, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 429, in cmdline
return cext.proc_cmdline(self.pid)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 77, in __exit__
self.gen.throw(type, value, traceback)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 376, in catch_zombie
raise AccessDenied(proc.pid, proc._name)
psutil.AccessDenied: psutil.AccessDenied (pid=1)
回溯(最近一次呼叫最后一次):
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第363行,在catch_zombie中
产量
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第429行
返回cext.proc\u cmdline(self.pid)
ProcessLookupError:[Errno 3]没有这样的进程(源于sysctl)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“test11.py”,第29行,在
打印(通过脚本名称(“test09.py”)获取PID)
文件“test11.py”,第15行,按脚本名获取PID
cmdline=proc.cmdline()
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_init__.py”,第694行
返回self.\u proc.cmdline()
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第342行,在包装器中
返回乐趣(自我、*args、**kwargs)
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第429行
返回cext.proc\u cmdline(self.pid)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py”,第77行,在退出时__
self.gen.throw(类型、值、回溯)
catch_zombie中第376行的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”
提升访问被拒绝(proc.pid,proc.\u name)
psutil.AccessDenied:psutil.AccessDenied(pid=1)
使用此代码并与cmd行进行字符串匹配
import psutil
# Iterate over all running process
for proc in psutil.process_iter():
try:
# Get process name & pid & cmd line from process object.
processName = proc.name()
processID = proc.pid
print(proc.cmdline())
print(processName , ' ::: ', processID)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
使用此代码并对cmd行执行字符串匹配
import psutil
# Iterate over all running process
for proc in psutil.process_iter():
try:
# Get process name & pid & cmd line from process object.
processName = proc.name()
processID = proc.pid
print(proc.cmdline())
print(processName , ' ::: ', processID)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
如果只需要当前脚本的pid,请使用
os.getpid
:
import os
pid = os.getpid()
但是,下面是使用psutil
查找运行命名python脚本的python进程的PID的示例。这可能包括当前进程,但主要用例用于检查其他进程,因为对于当前进程,只需使用上面所示的os.getpid
就更容易了
sleep.py
#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil
def get_pids_by_script_name(script_name):
pids = []
for proc in psutil.process_iter():
try:
cmdline = proc.cmdline()
pid = proc.pid
except psutil.NoSuchProcess:
continue
if (len(cmdline) >= 2
and 'python' in cmdline[0]
and os.path.basename(cmdline[1]) == script_name):
pids.append(pid)
return pids
print(get_pids_by_script_name('sleep.py'))
get_pids.py
#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil
def get_pids_by_script_name(script_name):
pids = []
for proc in psutil.process_iter():
try:
cmdline = proc.cmdline()
pid = proc.pid
except psutil.NoSuchProcess:
continue
if (len(cmdline) >= 2
and 'python' in cmdline[0]
and os.path.basename(cmdline[1]) == script_name):
pids.append(pid)
return pids
print(get_pids_by_script_name('sleep.py'))
运行它:
$ chmod +x sleep.py
$ cp sleep.py other.py
$ ./sleep.py &
[3] 24936
$ ./sleep.py &
[4] 24937
$ ./other.py &
[5] 24938
$ python get_pids.py
[24936, 24937]
如果只需要当前脚本的pid,请使用
os.getpid
:
import os
pid = os.getpid()
但是,下面是使用psutil
查找运行命名python脚本的python进程的PID的示例。这可能包括当前进程,但主要用例用于检查其他进程,因为对于当前进程,只需使用上面所示的os.getpid
就更容易了
sleep.py
#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil
def get_pids_by_script_name(script_name):
pids = []
for proc in psutil.process_iter():
try:
cmdline = proc.cmdline()
pid = proc.pid
except psutil.NoSuchProcess:
continue
if (len(cmdline) >= 2
and 'python' in cmdline[0]
and os.path.basename(cmdline[1]) == script_name):
pids.append(pid)
return pids
print(get_pids_by_script_name('sleep.py'))
get_pids.py
#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil
def get_pids_by_script_name(script_name):
pids = []
for proc in psutil.process_iter():
try:
cmdline = proc.cmdline()
pid = proc.pid
except psutil.NoSuchProcess:
continue
if (len(cmdline) >= 2
and 'python' in cmdline[0]
and os.path.basename(cmdline[1]) == script_name):
pids.append(pid)
return pids
print(get_pids_by_script_name('sleep.py'))
运行它:
$ chmod +x sleep.py
$ cp sleep.py other.py
$ ./sleep.py &
[3] 24936
$ ./sleep.py &
[4] 24937
$ ./other.py &
[5] 24938
$ python get_pids.py
[24936, 24937]
使用子流程库
导入子流程
script_name=“test09.py”
ps_out=subprocess.Popen(“ps-ef.split(“”),stdout=subprocess.PIPE,stderr=subprocess.PIPE)。stdout.read()。decode('UTF-8')。split(\n”)#启动命令行并收集输出
对于输入ps#输出:#在返回的ps行上循环
如果项目中有脚本名称:
script_pid=entry.split()[1]#检索行中的第二个条目
打破
打印(脚本和pid)
使用子流程库
导入子流程
script_name=“test09.py”
ps_out=subprocess.Popen(“ps-ef.split(“”),stdout=subprocess.PIPE,stderr=subprocess.PIPE)。stdout.read()。decode('UTF-8')。split(\n”)#启动命令行并收集输出
对于输入ps#输出:#在返回的ps行上循环
如果项目中有脚本名称:
script_pid=entry.split()[1]#检索行中的第二个条目
打破
打印(脚本和pid)
请你澄清一下你在这里想做什么。您是在试图找出同一个python进程内的pid(只需使用
os.getpid()
),还是在试图根据另一个python进程的命令行找出其pid?如果是第二个选项,那么它始终是您的进程之一,还是由另一个用户运行的进程?我想找到运行脚本的pid。例如我可以使用ps-ef | grep xxx
请你澄清一下你在这里想做什么。您是在试图找出同一个python进程内的pid(只需使用os.getpid()
),还是在试图根据另一个python进程的命令行找出其pid?如果是第二个选项,那么它始终是您的进程之一,还是由另一个用户运行的进程?我想找到运行脚本的pid。比如我可以用你的方式工作。但是应该除了更多:[psutil.NoSuchProcess,psutil.AccessDenied,]
@244boy我不相信捕获psutil.AccessDenied
是必要的。它只尝试读取全球可读的/proc//cmdline
。例如,如果试图提取受保护的环境变量(取决于对/proc//environ
的访问),则情况就不同了。一般来说,我不喜欢捕获有理由认为应该发生的异常之外的异常,因为这样做会隐藏bug。捕获psutil.NoSuchProcess
的原因只是为了防止有一个进程在迭代它们所需的短时间内终止(如果父进程确实仍然存在,则父进程已等待它)。我还看到另一个答案也捕获了psutil.ZombieProcess
。我不确定在什么情况下会出现这种异常,但我已经测试了t