唯一不錯我找到的方法是:如果進程仍在運行,您如何在Linux中使用Python進行檢查?
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
(Source)
但是,這可靠嗎?它是否適用於每個流程和每個分配?
唯一不錯我找到的方法是:如果進程仍在運行,您如何在Linux中使用Python進行檢查?
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
(Source)
但是,這可靠嗎?它是否適用於每個流程和每個分配?
馬克的回答是要走的路,畢竟,這就是爲什麼在/ proc文件系統是存在的。對於一些更復制/可粘貼的東西:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
在Linux上,您可以查看/ proc/$ PID目錄以獲取有關該進程的信息。事實上,如果該目錄存在,該進程正在運行。
它應該可以在任何POSIX系統上工作(儘管如其他人所建議的那樣查看/proc
文件系統,如果知道它將在那裏更容易)。
但是:os.kill
也可能失敗,如果您沒有權限發信號通知過程。你需要做的是這樣的:
import sys
import os
import errno
try:
os.kill(int(sys.argv[1]), 0)
except OSError, err:
if err.errno == errno.ESRCH:
print "Not running"
elif err.errno == errno.EPERM:
print "No permission to signal this process!"
else:
print "Unknown error"
else:
print "Running"
//但是這是可靠的嗎?它是否適用於每個流程和每個分配?
是的,它應該適用於任何Linux發行版。請注意,儘管(FreeBSD,OSX),基於Unix的系統中/ proc並不容易獲得。
下面是解決它,我的解決方案:我是一個Python + Linux新手
import os
import subprocess
import re
def findThisProcess(process_name):
ps = subprocess.Popen("ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE)
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
return output
# This is the function you can use
def isThisRunning(process_name):
output = findThisProcess(process_name)
if re.search('path/of/process'+process_name, output) is None:
return False
else:
return True
# Example of how to use
if isThisRunning('some_process') == False:
print("Not running")
else:
print("Running!")
,所以這可能不是最優的。它解決了我的問題,並希望能夠幫助其他人。
這將給出的例子當這個過程有多個孩子時會失敗。 – 2011-05-01 13:38:32
對我來說,基於PID的解決方案似乎太脆弱了。如果您試圖檢查狀態的進程已終止,則其PID可以被新進程重用。所以,國際海事組織ShaChris23 Python + Linux新手爲這個問題提供了最好的解決方案。即使它只適用於有問題的進程可通過其命令字符串唯一標識,或者您確信一次只能運行一個進程。
如果您正在運行某些版本的Linux,則唯一PID的數量爲32768或/ proc/sys/kernel/pid_max中的任何內容,這使得重複使用的PID不太可能用於短期運行的程序。 – 2012-01-06 19:57:14
ShaChris23腳本的修改版本。檢查是否proc_name中值處理ARGS字符串內找到(用於與蟒執行例如Python腳本):
def process_exists(proc_name):
ps = subprocess.Popen("ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
res = re.findall("(\d+) (.*)", line)
if res:
pid = int(res[0][0])
if proc_name in res[0][1] and pid != os.getpid() and pid != ps_pid:
return True
return False
我曾與上述版本(例如,功能也發現字符串,並這樣的事情的一部分問題.. 。) 所以我寫了我自己的,修改的馬克西姆Kozlenko的版本:
#proc -> name/id of the process
#id = 1 -> search for pid
#id = 0 -> search for name (default)
def process_exists(proc, id = 0):
ps = subprocess.Popen("ps -A", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
if line != "" and line != None:
fields = line.split()
pid = fields[0]
pname = fields[3]
if(id == 0):
if(pname == proc):
return True
else:
if(pid == proc):
return True
return False
我覺得它更可靠,更易於閱讀,你必須檢查進程ID或名字的選項。
我用這個來獲得過程,並指定名稱的過程中計數
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')
看到https://code.google.com/p/psutil/ – 2014-03-07 11:00:04