Ответ 1
Отметить ответ - путь, в конце концов, то, почему существует файловая система /proc. Для чего-то еще более скопируйте/вставьте:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
Единственный приятный способ, который я нашел:
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
(Источник)
Но является ли это надежным? Работает ли он с каждым процессом и каждым дистрибутивом?
Отметить ответ - путь, в конце концов, то, почему существует файловая система /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"
Вот решение, которое решило это для меня:
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!")
Я новичок в Python + Linux, поэтому это может оказаться не оптимальным. Он решил мою проблему и, надеюсь, поможет другим людям.
Но надежно ли это? Работает ли это с каждым процессом и каждым дистрибутивом?
Да, он должен работать на любом дистрибутиве Linux. Имейте в виду, что /proc нелегко доступен в системах на основе Unix (FreeBSD, OSX).
Кажется, что решение PID слишком уязвимо. Если процесс, который вы пытаетесь проверить статус, был прерван, его PID может быть повторно использован новым процессом. Итак, IMO ShaChris23 новичок Python + Linux дал лучшее решение проблемы. Даже он работает только в том случае, если рассматриваемый процесс однозначно идентифицируется по его командной строке или вы уверены, что будет только один запуск за раз.
Я использую это для получения процессов, а счетчик процесса указанного имени
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')
У меня были проблемы с версиями выше (например, функция нашла также часть строки и такие вещи...) поэтому я написал свою собственную модифицированную версию Максима Козленко:
#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
Я думаю, что он более надежный, более легкий для чтения, и у вас есть возможность проверить идентификаторы процессов или имена.
Sligtly модифицированная версия ShaChris23 script. Проверяет, найдено ли значение proc_name в строке arg процесса (например, Python script, выполненный с помощью 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