2016-05-20 13 views
1

私はomxplayerを起動するPythonコードを使用します。それは歌を演奏し、歌の間に広告を再生することがあります。この場合、2人の選手が走ります。この問題は、omxplayerがタイムアウトしたときに発生します。ないタイムアウトの後、私は今まで私がプロセスのPID番号を取得し、Pythonでkillするよりも

os.system("killall -9 omxplayer.bin") 

を使用しましたので、1曲だけが再生されているとき、それはOKですが、それを閉じることはできませんが、広告が歌とomxplayerがタイムアウト時に終了したとき(やります理由を知るが、タイムアウトが頻繁に起こる)このコマンドは両方のomxplayersを殺す。したがって、プロセスのPID(omxplayer.bin)をPythonの変数に格納してプロセスを終了させることができればそれは素晴らしいことです。しかし、私は与えられたプロセスのPIDを返すことができ、Pythonコードからそれを削除することができる任意のソリューションに感謝します。これまでに多くのことを試みました。誰もがこれで私を助けることができますか?

+2

PIDを取得するには[こちらをチェックしてください](http://stackoverflow.com/questions/26688936/python-how-to-get-pid-by-process-name)。 PIDでプロセスを終了させるには[これをチェックしてください](http://stackoverflow.com/questions/17856928/how-to-terminate-process-from-python-using-pid)。 –

+0

ありがとう!できます。 :) –

答えて

1

を可能な解決策、私はコメントとして:

import os 
import signal 
from subprocess import check_output 

def get_pid(name): 
    return check_output(["pidof", name]) 

def main(): 
    os.kill(get_pid(whatever_you_search), signal.SIGTERM) #or signal.SIGKILL 

if __name__ == "__main__": 
    main() 
+0

何らかの理由で、サブプロセスモジュールが私のために機能しません。私はモジュールから、ほとんどすべてのコマンドを試しました。プログラムはエラーを投げません。私はちょうど答えを得ていません。入力したコマンドは、存在しないように動作します。 –

1

私は、具体的psutil.process_iter()psutilを使用してお勧めします:

>>> # get all PIDs 
>>> psutil.pids() 
[0, 4, 472, 648, 756, ...] 
>>> # but for iteration you should use process_iter() 
>>> for proc in psutil.process_iter(): 
>>>  try: 
>>>   if pinfo.name() == "omxplayer": 
>>>    pinfo.terminate() 
>>>  except psutil.NoSuchProcess: 
>>>   pass 
+0

それは良い解決策のようです。そして、プロセスを終了するのではなく、プロセスのPIDを取得するにはどうすればよいですか? –

+0

@TiborBalogh PIDだけが必要な場合は、['pinfo.pid'](https://pythonhosted.org/psutil/#psutil.Process.pid)を使用してください。 – MilkeyMouse

0

私はこの質問は古いですが、ここで私が出てきたものを知っていますと、それはjava procesesのために働く:

最初にpidを得る

def getPidByName(name): 
    process = check_output(["ps", "-fea"]).split('\n') 
    for x in range(0, len(process)): 
     args = process[x].split(' ') 
     for j in range(0, len(args)): 
      part = args[j] 
      if(name in part): 
       return args[2] 

そして殺すこと のpid = getPidByNameをちょうど@ElTête述べたように( "ユーザー・アクセス") os.kill(int型(PID)、signal.SIGKILL)

異なるプロセスでは、killしようとしているプロセスによっては、argsの戻り値を調整する必要があります。またはコマンド全体を繰り返して、名前の出現箇所を見つけてください。これは、主に "pidof"がmacOsやwindowsでは動作しないためです。

関連する問題