Как вы проверяете Linux с Python, если процесс все еще запущен?

Единственный хороший способ, который я нашел, это:

import sys import os try: os.kill(int(sys.argv[1]), 0) print "Running" except: print "Not running" 

( Источник )
Но является ли это надежным? Работает ли он с каждым процессом и каждым дистрибутивом?

  • Как добавить расширения файлов на основе типа файла в Linux / Unix?
  • Python: назначение вывода печати переменной
  • Восстановление из zmq.error.ZMQError: адрес уже используется
  • Можете ли вы обмануть isatty AND log stdout и stderr отдельно?
  • Nginx, django, gunicorn, ubuntu 14.04 (13: Разрешение отказано) при подключении к восходящему потоку
  • Как найти точку монтирования файла?
  • Удаление разрешений root в Python
  • Убийство подпроцесса, включая его дочерние элементы из python
  • 9 Solutions collect form web for “Как вы проверяете Linux с Python, если процесс все еще запущен?”

    Ответ Марка – путь, потому что именно поэтому существует файловая система / 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. Имейте в виду, что / proc не легко доступен в системах на базе Unix (FreeBSD, OSX).

    Вот решение, которое решило его для меня:

     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, поэтому это может быть не оптимальным. Он решил мою проблему и, надеюсь, поможет другим людям.

    Кажется, что решение 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 

    Я думаю, что он более надежный, более легкий для чтения, и у вас есть возможность проверить идентификаторы процессов или имена.

    Слишком измененная версия скрипта ShaChris23. Проверяет, найдено ли значение proc_name в строке процесса args (например, скрипт Python, выполненный с помощью 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 
    Python - лучший язык программирования в мире.