名前でプロセスを強制終了しますか?


99

プロセス(特にiChat)を強制終了しようとしています。コマンドラインでは、次のコマンドを使用します。

ps -A | grep iChat 

次に:

kill -9 PID

ただし、これらのコマンドをPythonに変換する方法が正確にわかりません。

回答:


86

Unixライクなプラットフォーム(ps -A存在するため)を使用していると仮定すると

>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()

変数(文字列)にps -A出力を提供しますout。あなたはそれを行に分解してそれらをループすることができます...:

>>> for line in out.splitlines():
...   if 'iChat' in line:
...     pid = int(line.split(None, 1)[0])
...     os.kill(pid, signal.SIGKILL)
... 

(のインポートを避けての代わりにsignal使用することもできますが、私はそのスタイルが特に好きではないので、このように名前付き定数を使用しました)。9signal.SIGKILL

もちろん、これらの行ではるかに高度な処理を行うこともできますが、これはシェルで行っていることを模倣しています。

あなたが気にしているのがを回避している場合ps、異なるUnixライクなシステム全体でそれを行うことは困難です(psある意味でプロセスリストを取得するための共通のAPIです)。ただし、特定のUnixライクなシステムを念頭に置いている場合のみ(クロスプラットフォームの移植性を必要としない)、それは可能かもしれません。特にLinuxでは、/proc疑似ファイルシステムが非常に役立ちます。ただし、この後半の部分を支援する前に、正確な要件を明確にする必要があります。


1
それはとてもうまくいきました!私はMac環境を実行しているので、これは完璧だと思います。ご協力ありがとうございます。
アーロン

上記は.nixで動作しますが、pythonicではありません。以下に示すように、コアPythonの一部であるos.system( 'taskkill / f / im exampleProcess.exe')アプローチを使用するのが適切な方法です。
Jonesome Reinstate Monica、2015

@Jonesome:あなたの答えは(コマンド構文と.exeファイル名のため)Windowsのようですが、質問はMac OSのようです。
Vasudev Ram

私はこの回答をGiampaoloRodolàの方が好んでいます。なぜなら、それは非常にPythonicではありませんが、CygwinまたはMsysがインストールされていることを前提として、Windowsで機能するためです。psutilは、WindowsのPython 2.7.10にはありません。私のマシンでは「pip install psutil」を実行しようとして失敗し、Visual C ++ 9.0をインストールする必要があると述べました。ねじ込んで!CygwinまたはMsysをインストールしたほうがいいです。
Andrew Bainbridge 2016

Python 3.2以降、Windowsで動作しますが、通常、シグナルは強制終了されたプロセスの終了コードになります。
Cees Timmerman、2018

201

psutilは、名前でプロセスを見つけて強制終了できます。

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()

51
この。それがあるので、クロスプラットフォーム
Bengt 2013

2
または、コマンドラインで次のようにしたい場合:if "your_python_script.py" in proc.cmdline:..kill
OWADVL

11
これの欠点はpsutil、ターゲットマシンに存在しない可能性があるパッケージが必要になることです。
CadentOrange 2014

1
@Bengt。Windowsを含めた場合、これはクロスプラットフォームではありません。psutilはPython 2.7.10の一部ではありません。また、Visual C ++ 9.0をインストールしない限り、「pip install psutil」は失敗します。これは、多くの場合非現実的です。それでも、17件の賛成票おめでとう:-)
Andrew Bainbridge

5
「pip install psutil」は、pypiのホイールバージョンを取得するので問題なく動作します。いいえ、コンパイラは必要ありません。
GiampaoloRodolà16年

36

クロスプラットフォームになるためにWindowsのケースを考慮する必要がある場合は、以下を試してください。

os.system('taskkill /f /im exampleProcess.exe')

@ alansiqueira27残念ながら、これはWindows cmdの場合のみです。クロスプラットフォームソリューションについては、上記の回答を参照する必要があります。
リミットクラッカー2018

これは私のユースケースでうまくいきました。ありがとう!これはきちんとしている、それは殺すことに注意してください、すべてのあなたは、複数のY.exeの終端でないを持っている場合は、すべてのプロセスIDのそれのが終了しますので、その名前によりプロセスを。
AlgebraicGeometryStudent

23

killallを使用している場合:

os.system("killall -9 iChat");

または:

os.system("ps -C iChat -o pid=|xargs kill -9")

9
ありますpkill、私は私の代わりにそれを使用して、世界で唯一の人だと思うが、killall
マイケルMrozek

1
わかりました。最初のコマンドは完全に機能したようです。助けてくれてありがとう。
アーロン

1
@MichaelMrozek次のようにタイプすることの甘い感覚でどのように生活できますkillall javaか?
Alois Mahdal 2013年

@Michael私が知っていたのは「すべてを殺す」ものpkillだけkillallだったので、私はそれを使用しています。
カイルストランド14

7

これはwindows 7で私のために働きました

import subprocess
subprocess.call("taskkill /IM geckodriver.exe")

3

これを試すことができます。しかし、あなたがpsutilをインストールする必要がある前にsudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()

受け入れられた回答がすでにこのソリューションを説明している場合でも、少なくともこれは移植可能です。
ジャン=フランソワ・ファーブル

2

以下のコードは、すべてのiChat指向のプログラムを強制終了します。

p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE)
out, err = p.communicate()

for line in out.splitlines():        
    line = bytes.decode(line)
    pid = int(line.split(None, 1)[0])
    os.kill(pid, signal.SIGKILL)

1

pkill <process_name>UNIXシステムで名前を使用してプロセスを強制終了できます。

次に、Pythonコードは次のようになります。

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)

私が使用しているシステムはすべてMacで、pkillを実行しようとすると、コマンドが見つからないというメッセージが表示されます。
アーロン

1

特定のタイトルを持つプロセスまたはcmd.exeを強制終了する場合。

import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]

# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
    for title in titles:
        if  title in line['Window Title']:
           print line['Window Title']       
           PIDList.append(line['PID'])

# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
    os.system('taskkill /pid ' + id ) 

それが役に立てば幸い。彼らは私の多くのより良い解決策かもしれません。


0

WMIモジュールを使用してWindowsでこれを行うことができますが、UNIXの人が慣れているよりもはるかに不格好です。import WMI長い時間がかかり、その過程で中間の痛みがあります。


0

私にとって、うまくいったことは、

例えば

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()

0

9はSIGKILL信号を表します。だからKILL9の代わりに使えます

os.system("kill -s KILL 1234")

0r

os.sytem("kill -KILL 1234")

0
import os, signal

def check_kill_process(pstring):
    for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
        fields = line.split()
        pid = fields[0]
        os.kill(int(pid), signal.SIGKILL)

0

Alex Martelliの回答はPython 3では機能しません。これoutは、バイトオブジェクトになるため、TypeError: a bytes-like object is required, not 'str'テスト時にa になるためif 'iChat' in line:です。

サブプロセスのドキュメントからの引用:

communication()はタプル(stdout_data、stderr_data)を返します。ストリームがテキストモードで開かれた場合、データは文字列になります。それ以外の場合はバイト。

Python 3の場合、これはtext=True(> = Python 3.7)またはuniversal_newlines=True引数をPopenコンストラクターに追加することで解決します。outその後、文字列オブジェクトとして返されます。

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()

for line in out.splitlines():
    if 'iChat' in line:
        pid = int(line.split(None, 1)[0])    
        os.kill(pid, signal.SIGKILL)

または、バイトのdecode()メソッドを使用して文字列を作成することもできます。

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()

for line in out.splitlines():
    if 'iChat' in line.decode('utf-8'):
        pid = int(line.split(None, 1)[0])    
        os.kill(pid, signal.SIGKILL)

-1
import psutil
pid_list=psutil.get_pid_list()
print pid_list
p = psutil.Process(1052)
print p.name
for i in pid_list:
    p = psutil.Process(i)
    p_name=p.name
    print str(i)+" "+str(p.name)
    if p_name=="PerfExp.exe":
        print "*"*20+" mam ho "+"*"*20
        p.kill()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.