Подтвердить что ты не робот

Как проверить, работает ли процесс с использованием Python в Linux?

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

import sys
import os

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

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

4b9b3361

Ответ 1

Отметить ответ - путь, в конце концов, то, почему существует файловая система /proc. Для чего-то еще более скопируйте/вставьте:

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

Ответ 2

на linux вы можете посмотреть в каталоге /proc/ $PID, чтобы получить информацию об этом процессе. Фактически, если каталог существует, процесс выполняется.

Ответ 3

Он должен работать в любой системе 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"

Ответ 4

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

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

Ответ 5

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

Да, он должен работать на любом дистрибутиве Linux. Имейте в виду, что /proc нелегко доступен в системах на основе Unix (FreeBSD, OSX).

Ответ 6

Кажется, что решение PID слишком уязвимо. Если процесс, который вы пытаетесь проверить статус, был прерван, его PID может быть повторно использован новым процессом. Итак, IMO ShaChris23 новичок Python + Linux дал лучшее решение проблемы. Даже он работает только в том случае, если рассматриваемый процесс однозначно идентифицируется по его командной строке или вы уверены, что будет только один запуск за раз.

Ответ 7

Я использую это для получения процессов, а счетчик процесса указанного имени

import os

processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')

Ответ 8

У меня были проблемы с версиями выше (например, функция нашла также часть строки и такие вещи...) поэтому я написал свою собственную модифицированную версию Максима Козленко:

#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

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

Ответ 9

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