Respostas:
Supondo que você esteja em uma plataforma semelhante ao Unix (para que ps -A
exista),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
fornece ps -A
a saída na out
variável (uma string). Você pode dividi-lo em linhas e fazer um loop nelas ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(você poderia evitar a importação signal
e usar em 9
vez de signal.SIGKILL
, mas eu simplesmente não gosto desse estilo, então prefiro usar a constante nomeada desta forma).
Claro que você poderia fazer um processamento muito mais sofisticado nessas linhas, mas isso imita o que você está fazendo no shell.
Se o que você está procurando é evitar ps
, isso é difícil de fazer em diferentes sistemas semelhantes ao Unix ( ps
é a API comum deles para obter uma lista de processos, em certo sentido). Mas se você tiver um sistema semelhante ao Unix específico em mente, apenas (não requer qualquer portabilidade de plataforma cruzada), pode ser possível; em particular, no Linux, o /proc
pseudo-sistema de arquivos é muito útil. Mas você precisará esclarecer seus requisitos exatos antes de podermos ajudar nesta última parte.
psutil pode encontrar o processo pelo nome e eliminá- lo:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
pacote, que pode não estar presente na máquina de destino.
Se você tiver que considerar o caso do Windows para ser multiplataforma, tente o seguinte:
os.system('taskkill /f /im exampleProcess.exe')
Se você tiver killall:
os.system("killall -9 iChat");
Ou:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, embora eu pense que sou a única pessoa no mundo que usa isso em vez dekillall
killall java
?
pkill
porque o único que killall
eu conhecia era o "mata tudo".
Você pode tentar isso. mas antes você precisa instalar o psutil usandosudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
O código a seguir eliminará todos os programas orientados para 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)
Você pode usar pkill <process_name>
em um sistema unix para matar processos pelo nome.
Então, o código python será:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Se você deseja encerrar o (s) processo (s) ou cmd.exe que carrega um determinado título (s).
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 )
Espero que ajude. Podem haver várias soluções melhores para mim.
9 representa o sinal SIGKILL. Então você pode usar KILL
no lugar de 9
os.system("kill -s KILL 1234")
0r
os.sytem("kill -KILL 1234")
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)
A resposta de Alex Martelli não funcionará no Python 3 porque out
será um objeto bytes e, portanto, resultará em um TypeError: a bytes-like object is required, not 'str'
teste ao if 'iChat' in line:
.
Citando a documentação do subprocesso :
Communic () retorna uma tupla (stdout_data, stderr_data). Os dados serão strings se os streams forem abertos no modo de texto; caso contrário, bytes.
Para Python 3, isso é resolvido adicionando o text=True
(> = Python 3.7) ou universal_newlines=True
argumento ao Popen
construtor. out
será então retornado como um objeto string.
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)
Como alternativa, você pode criar uma string usando o método decode () de bytes.
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)