이름으로 프로세스를 종료 하시겠습니까?


99

프로세스 (특히 iChat)를 종료하려고합니다. 명령 줄에서 다음 명령을 사용합니다.

ps -A | grep iChat 

그때:

kill -9 PID

그러나 이러한 명령을 Python으로 변환하는 방법을 정확히 모르겠습니다.

답변:


86

유닉스 계열 플랫폼에 있다고 가정하면 ( 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, 다른 유닉스 계열 시스템에서 수행하기 어렵다 ps면 (어떤 의미에서 프로세스 목록을 얻는 공통 API입니다). 그러나 특정 Unix 계열 시스템을 염두에두고 있다면 (크로스 플랫폼 이식성이 필요하지 않음) 가능할 수 있습니다. 특히 Linux에서는 /proc의사 파일 시스템이 매우 유용합니다. 그러나이 후반부에 도움을 드릴 수 있으려면 정확한 요구 사항을 명확히해야합니다.


1
그것은 아주 잘 작동했습니다! 저는 Mac 환경을 실행하고 있으므로 이것이 완벽 할 것이라고 생각합니다. 모든 도움에 감사드립니다.
Aaron

위의 .nix에서 작동하지만 파이썬이 아닙니다. 아래에 게시 된 적절한 방법은 핵심 파이썬의 일부인 os.system ( 'taskkill / f / im exampleProcess.exe') 접근 방식을 사용하는 것입니다.
Jonesome Reinstate Monica 2015

@Jonesome : 귀하의 대답은 Windows 용인 것 같습니다 (명령 구문 및 .exe 파일 이름으로 인해). 질문은 Mac OS 용인 것 같습니다.
Vasudev Ram

나는 Giampaolo Rodolà의 대답을 선호합니다. 왜냐하면 Pythonic이 아니지만 Cygwin 또는 Msys가 설치되어 있다고 가정하면 Windows에서 작동하기 때문입니다. psutil은 Windows의 Python 2.7.10에 없습니다. 내 컴퓨터에서 "pip install psutil"시도가 실패하여 Visual C ++ 9.0을 설치해야한다고 말했습니다. 나사! 오히려 Cygwin 또는 Msys를 설치하고 싶습니다.
Andrew Bainbridge

Python 3.2부터 Windows에서 작동하지만 일반적으로 신호는 종료 된 프로세스의 종료 코드입니다.
Cees Timmerman

202

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

2
또는 다음과 같은 명령 줄로 원하는 경우 : if "your_python_script.py"in proc.cmdline : ..kill
OWADVL

11
이것의 단점은 psutil대상 컴퓨터에 없을 수 있는 패키지 가 필요하다는 것 입니다.
CadentOrange

1
@Bengt. Windows를 포함하면 교차 플랫폼아닙니다 ! psutil은 Python 2.7.10의 일부가 아닙니다. Visual C ++ 9.0을 설치하지 않으면 "pip install psutil"이 실패합니다. 이는 대부분의 경우 비실용적입니다. 그럼에도 불구하고, 당신의 17 upvotes :-)에 축하
앤드류 베인 브릿지

5
"pip install psutil"은 pypi에서 휠 버전을 검색하므로 잘 작동합니다. 아니, 컴파일러가 필요하지 않습니다.
Giampaolo Rodolà

36

크로스 플랫폼이되기 위해 Windows 사례를 고려해야하는 경우 다음을 시도하십시오.

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

@ alansiqueira27 불행히도 Windows cmd 케이스 일뿐입니다. 크로스 플랫폼 솔루션에 대한 위의 답변을 확인해야합니다.
limitcracker

이것은 내 사용 사례에 효과적이었습니다. 고맙습니다! 참고이 깔끔한 것을, 그것을 죽이고 모든 모든 프로세스 ID의 그것의 종료되며, 여러 Y.exe이 종료 아니에요 그래서 경우에 그 이름으로 프로세스를.
AlgebraicGeometryStudent

23

killall이있는 경우 :

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

또는:

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

9
pkill나는 또한 그것을 대신 사용하는 세상에서 유일한 사람이라고 생각하지만killall
Michael Mrozek

1
좋습니다. 첫 번째 명령이 완벽하게 작동 한 것 같습니다. 도와 주셔서 감사합니다.
Aaron

1
@MichaelMrozek 어떻게 타이핑하는 달콤한 느낌으로 살 수 killall java있습니까?
Alois Mahdal 2013

@Michael 내가 아는 pkill유일한 killall것은 "모든 것을 죽이는"하나 이기 때문에 사용 합니다 .
Kyle Strand

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()

받아 들여진 답변이 이미이 솔루션을 설명하더라도 적어도 이식 가능합니다.
Jean-François Fabre

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>유닉스 시스템에서 사용 하여 이름으로 프로세스를 종료 할 수 있습니다 .

그러면 파이썬 코드는 다음과 같습니다.

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

내가 사용하는 모든 시스템은 Mac이고 pkill을 실행하려고하면 명령을 찾을 수 없다는 메시지 만 표시됩니다.
Aaron

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에서이 작업을 수행 할 수 있지만 유닉스 사람들이 익숙한 것보다 훨씬 복잡합니다. import WMI시간이 오래 걸리고 그 과정에서 중간 정도의 고통이 있습니다.


0

나를 위해 일한 유일한 것은 다음과 같습니다.

예를 들면

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

0

9는 SIGKILL 신호를 나타냅니다. 그래서 당신 KILL은 9 대신 사용할 수 있습니다

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 답변은 out바이트 객체 이기 때문에 Python 3에서 작동하지 않으므로 TypeError: a bytes-like object is required, not 'str'테스트 할 때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.