我试图找出进程是否基于进程ID运行.根据论坛上的帖子之一,代码如下.我不能考虑进程名称,因为有多个进程使用相同的名称运行.
def findProcess( processId ):
ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE)
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
return output
def isProcessRunning( processId):
output = findProcess( processId )
if re.search(processId, output) is None:
return true
else:
return False
Run Code Online (Sandbox Code Playgroud)
输出:
1111 72312 72311 0 0:00.00 ttys000 0:00.00 /bin/sh -c ps -ef | grep 71676
1111 72314 72312 0 0:00.00 ttys000 0:00.00 grep 71676
Run Code Online (Sandbox Code Playgroud)
它总是返回true,因为它可以在输出字符串中找到进程id.
有什么建议?谢谢你的帮助.
use*_*876 41
尝试:
os.kill(pid, 0)
Run Code Online (Sandbox Code Playgroud)
如果进程存在,则应该成功(并且不执行任何操作),或者如果进程不存在则抛出异常(可以捕获).
dic*_*ato 10
我认为最简单的答案(albiet可能并不理想),就是改变你的想法
ps -ef | grep <pid>
Run Code Online (Sandbox Code Playgroud)
至:
ps -ef | grep <pid> | grep -v grep
Run Code Online (Sandbox Code Playgroud)
这将忽略包含您要查找的进程的PID的grep搜索的进程列表.
看来user9876的答案更像是"pythonic".
您可以检查文件夹/ proc/[process_id]是否存在.
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
Run Code Online (Sandbox Code Playgroud)
请参阅此SO:如果进程仍在运行,如何使用Python检查Linux?
这有点像kludge,但在*nix上你可以使用os.getpgid(pid)或os.kill(pid,sig)来测试进程ID的存在.
import os
def is_process_running(process_id):
try:
os.kill(process_id, 0)
return True
except OSError:
return False
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,os.kill适用于Windows(从Python 2.7开始),而os.getpgid 不是. 但 Windows版本调用TerminateProcess(),它将"无条件地导致进程退出",所以我预测它不会安全地返回您想要的信息而不实际杀死进程(如果存在的话).
如果您使用的是Windows,请告诉我们,因为在这种情况下,这些解决方案都不可接受.
我知道这已经过时了,但我已经习惯了它,它似乎有用了; 您可以快速调整以从进程名称转换为进程ID:
try:
if len( os.popen( "ps -aef | grep -i 'myprocess' | grep -v 'grep' | awk '{ print $3 }'" ).read().strip().split( '\n' ) ) > 1:
raise SystemExit(0)
except Exception, e:
raise e
Run Code Online (Sandbox Code Playgroud)