38

私が見つけた唯一の良い方法は次のとおりです。

import sys
import os

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

出典
しかし、これは信頼できますか?すべてのプロセスとすべてのディストリビューションで機能しますか?

4

9 に答える 9

55

マークの答えは、結局のところ、/proc ファイル システムがそこにある理由です。もう少しコピー/貼り付け可能なもの:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
于 2008-09-01T18:06:42.690 に答える
29

Linux では、ディレクトリ /proc/$PID を調べて、そのプロセスに関する情報を取得できます。実際、ディレクトリが存在する場合、プロセスは実行されています。

于 2008-09-01T15:50:56.243 に答える
12

どの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"
于 2008-09-01T17:40:47.417 に答える
9

これが私のためにそれを解決した解決策です:

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 の初心者なので、これは最適ではないかもしれません。それは私の問題を解決し、うまくいけば他の人にも役立つでしょう.

于 2010-11-09T21:49:08.413 に答える
6

しかし、これは信頼できますか?すべてのプロセスとすべてのディストリビューションで機能しますか?

はい、どのLinuxディストリビューションでも動作するはずです。ただし、Unixベースのシステム(FreeBSD、OSX)では/procを簡単に利用できないことに注意してください。

于 2008-09-05T11:02:11.927 に答える
5

私には、PID ベースのソリューションは脆弱すぎるようです。ステータスを確認しようとしているプロセスが終了している場合、その PID を新しいプロセスで再利用できます。そのため、Python + Linux の初心者である IMO ShaChris23 が、この問題に対する最善の解決策を提供してくれました。問題のプロセスがそのコマンド文字列によって一意に識別できる場合、または一度に1つしか実行されていないことが確実な場合にのみ機能します。

于 2011-02-24T23:51:09.967 に答える
4

上記のバージョンには問題がありました (たとえば、関数が文字列の一部なども検出されたなど...)。そのため、Maksym 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 または名前をチェックするオプションがあると思います。

于 2012-08-02T20:05:52.587 に答える
0

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
于 2011-08-10T09:31:19.213 に答える