others - 在 python ( 在 linux/unix中) 中,检查进程是否正在运行

  • 如何检查pid的进程是否存在?

由于有多个进程运行同一名称,所以无法考虑进程名。


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

输出:


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

它总是return true,因为,它可以在输出字符串中找到进程id 。

时间:

尝试以下方法:

 
os.kill(pid, 0)

 


ps -ef | grep <pid>

到:


ps -ef | grep <pid> | grep -v grep

这有点复杂,但是在*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

注意os.kill在Windows (从python 2.7开始)上工作,而os.getpgid不能,但是Windows版本调用terminateProcess(),因此我觉得它不会安全地返回你想要的信息。

如果你不介意使用外部模块,那么我建议psutil 。

如果该进程属于同一用户检查进程,则可以尝试将它kill ,如果使用信号0,kill将不会发送内容,但是仍然允许你确定该进程是否可用。

来自kill(2)

如果sig为0,则不发送信号,但是仍执行错误检查; 这可用于检查进程ID或进程组ID是否存在。

在Windows上另一个选项是使用tasklist.exe :

Syntax : tasklist.exe /NH /FI "PID eq processID "


def IsProcessRunning( processId ):
 ps= subprocess.Popen(r'tasklist.exe /NH /FI"PID eq %d"' % (processId), shell=True, stdout=subprocess.PIPE)
 output = ps.stdout.read()
 ps.stdout.close()
 ps.wait()
 if processId in output:
 return True
 return False

你可以检查文件夹/proc/[process_id]是否存在。


 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True

在Windows上,可以使用WMI 。


from win32com.client import GetObject
GetObject('winmgmts:').ExecQuery("Select * from Win32_Process where ProcessId =" + str(pid)).count

例如,我很可能只是想知道一个进程是按名称运行还是采取操作,例如,如果DbgView未运行,则启动它。


if not GetObject('winmgmts:').ExecQuery("Select * from Win32_Process where Name = 'dbgview.exe'").count:
 subprocess.Popen(r"C:Udbgview.exe", shell=False)

完整列表为这里 。

我知道这是旧的,但是我已经用过了,它可以工作,你可以快速调整,从进程名称转换为进程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


children = subprocess.Popen('someProcess')
if children.poll() == '0':
 print 'process died'

...