Как проверить Linux с помощью Python, если процесс все еще работает?[дубликат]

StackOverflow https://stackoverflow.com/questions/38056

  •  09-06-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

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

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

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

Слегка модифицированная версия скрипта ShaChris23.Проверяет, найдено ли значение proc_name в строке аргументов процесса (например, скрипт 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top