programing

이름으로 프로세스를 죽입니까?

anycallme 2023. 11. 2. 22:03

이름으로 프로세스를 죽입니까?

프로세스(특히 아이챗)를 없애려고 합니다.명령줄에서는 다음 명령을 사용합니다.

ps -A | grep iChat 

그러면:

kill -9 PID

하지만 이 명령어들을 파이썬으로 어떻게 번역해야 할지 정확히 모르겠습니다.

psutil은 이름으로 프로세스를 찾아 죽일 수 있습니다.

import psutil

PROCNAME = "python.exe"

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

유닉스 계열 플랫폼에 있다고 가정할 경우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, 사용.9대신에signal.SIGKILL, 다만 특별히 그런 스타일이 마음에 들지 않아서 차라리 이런 식으로 상수를 사용하고 싶습니다.)

물론 이러한 라인에 대해 훨씬 더 정교한 처리를 수행할 수 있습니다. 하지만 이는 셸에서 수행하는 작업과 유사합니다.

만약 당신이 원하는 것이 피하려는 것은ps, 다양한 유닉스 계열 시스템에서 수행하기 어려운 작업입니다.ps는 어떤 의미에서 프로세스 목록을 얻기 위한 공통 API입니다.그러나 특정 유닉스 계열 시스템을 염두에 두고 있다면 (크로스 플랫폼 이식이 필요하지 않은) 가능할 수도 있습니다. 특히 Linux의 경우,/proc의사 파일 시스템은 매우 도움이 됩니다.하지만 우리가 이 후반부에 도움을 주기 전에 당신의 정확한 요구사항을 명확히 해야 할 것입니다.

크로스 플랫폼이 되기 위해 Windows 케이스를 고려해야 한다면 다음을 시도해 보십시오.

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

모두 처치한 경우:

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

또는:

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

이것을 시도해 볼 수 있습니다. 그러나 psutil을 설치하기 전에sudo pip install psutil

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

이것은 윈도우 7에서 나에게 효과가 있었습니다.

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

아래 코드는 모든 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)

다음을 사용하여Process.

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>> 

사용할 수 있습니다.psutil이름을 사용하여 프로세스를 삭제하는 모듈.대부분의 경우, 이것은 크로스 플랫폼이어야 합니다.

import traceback

import psutil


def kill(process_name):
    """Kill Running Process by using it's name
    - Generate list of processes currently running
    - Iterate through each process
        - Check if process name or cmdline matches the input process_name
        - Kill if match is found
    Parameters
    ----------
    process_name: str
        Name of the process to kill (ex: HD-Player.exe)
    Returns
    -------
    None
    """
    try:
        print(f'Killing processes {process_name}')
        processes = psutil.process_iter()
        for process in processes:
            try:
                print(f'Process: {process}')
                print(f'id: {process.pid}')
                print(f'name: {process.name()}')
                print(f'cmdline: {process.cmdline()}')
                if process_name == process.name() or process_name in process.cmdline():
                    print(f'found {process.name()} | {process.cmdline()}')
                    process.terminate()
            except Exception:
                print(f"{traceback.format_exc()}")

    except Exception:
        print(f"{traceback.format_exc()}")

저는 기본적으로 @Giampaolo Rodola의 답변을 확장했습니다.

  • 예외처리 추가
  • cmdline을 보기 위한 체크

저도 이 토막글을 요지로 올렸습니다.

참고: 원하는 동작이 확인되면 인쇄문을 삭제할 수 있습니다.

WMI 모듈을 사용하여 window에서 이 작업을 수행할 수 있습니다. Unix polks가 사용하는 것보다 훨씬 더 복잡합니다.import WMI시간이 오래 걸리고 중간 정도의 통증이 있습니다

프로세스(들) 또는 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 ) 

도움이 되길 바랍니다.그들은 제게 더 나은 수많은 해결책이 될 것입니다.

알렉스 마르텔리의 대답은 파이썬 3에서는 통하지 않을 것입니다. 왜냐하면out바이트 객체가 될 것이고 따라서 결과는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)

또는 바이트의 디코드() 메서드를 사용하여 문자열을 만들 수도 있습니다.

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)

Giampaolo Rodola'의 답변과 동일한 스타일이지만 하나의 라이너로서 대소문자를 구분하지 않고 전체 프로세스 이름과 일치시킬 필요 없이 창에 다음을 포함해야 합니다..exe접미사

[x.kill() for x in psutil.process_iter() if 'ichat' in x.name().lower()]

제게 있어서 유일하게 효과가 있었던 것은 다음과 같습니다.

예를들면

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
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)

사용가능pkill <process_name>유닉스 시스템에서 이름으로 프로세스를 죽일 수 있습니다.

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

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
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()

언급URL : https://stackoverflow.com/questions/2940858/kill-process-by-name