Muitas vezes, preciso matar um processo durante a programação.
O jeito que eu faço agora é:
[~]$ ps aux | grep 'python csp_build.py'
user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py
user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py
[~]$ kill 5124
Como posso extrair a identificação do processo automaticamente e matá-la na mesma linha?
Como isso:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Respostas:
Em
bash
, você deve ser capaz de:Os detalhes de seu funcionamento são os seguintes:
ps
fornece a lista de todos os processos.grep
filtros que, com base na sua sequência de pesquisa,[p]
são um truque para impedir que você pegue o valor realgrep
processo .awk
just fornece o segundo campo de cada linha, que é o PID.$(x)
construção significa executar, emx
seguida, pegue sua saída e coloque-a na linha de comando. A saída desseps
pipeline dentro dessa construção acima é a lista de IDs de processo, então você termina com um comando comokill 1234 1122 7654
.Aqui está uma transcrição mostrando em ação:
e você pode vê-lo terminando todos os dormentes.
Explicando o
grep '[p]ython csp_build.py'
bit com mais detalhes:Quando você
sleep 3600 &
segueps -ef | grep sleep
, você tende a ter dois processossleep
nele, osleep 3600
e ogrep sleep
(porque ambos têmsleep
nele, isso não é ciência do foguete).No entanto,
ps -ef | grep '[s]leep'
não criará um processosleep
nele, ele criará,grep '[s]leep'
e aqui está a parte complicada:grep
não o encontra porque está procurando a expressão regular "qualquer caractere da classe de caractere[s]
(que és
) seguido porleep
.Em outras palavras, ele está procurando,
sleep
mas o processo grep é ogrep '[s]leep'
que não possuisleep
.Quando me mostraram isso (por alguém aqui no SO), imediatamente comecei a usá-lo porque
| grep -v grep
; efonte
kill
ocorrerá com a saída padrão #kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
grep '[p]ython csp_build.py'
você também pode usar:kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')
.grep -v
retorna linhas não correspondentes.se você tiver pkill,
Se você deseja apenas grep com o nome do processo (em vez da lista completa de argumentos), pare
-f
.fonte
pgrep
epkill
trabalhe contanto que você especifique o processo corretamente. Por padrão, apenas o nome do processo é correspondido, o que quase certamente é apenas "python" neste caso. Usepgrep -f "python csp_build.py"
para corresponder ao comando completo.pkill -9 -f csp_build.py
Um forro:
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
é opcionalkill -9 5124
,kill -9 5373
etc (matar -15 é mais graciosa, mas um pouco mais lento)Bônus:
Eu também tenho 2 funções de atalho definidas no meu .bash_profile (~ / .bash_profile é para osx, você precisa ver o que funciona na sua máquina * nix).
p csp_build
,p python
etc.código bash_profile:
ka csp_build
,ka python
etc.ka csp_build 15
,ka python 9
código bash_profile:
fonte
source ~/.bash_profile
no shell atual para importar as novas funções (é o que eu prefiro).grep
. Lembre-se, qualquer coisa que se parecegrep x | awk '{ y }'
é geralmente melhor e muitas vezes mais robusto se você substituí-lo comawk '/x/ { y }'
Interprete o padrão do nome do processo como uma expressão regular estendida.
fonte
Tente usar
fonte
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill
trabalhou para mim. thanxgrep
pode, e a maioria simples e elegante. O caso trivial degrep x y | awk '{ z }'
é sempre melhor escritoawk '/x/ { z }' y
- veja também o uso inútil degrep
.Você pode usar apenas
pkill '^python*'
para extermínio de processos regex.Se você quiser ver o que você irá matar ou encontrar antes de matar, use
pgrep -l '^python*'
where -l outputs e também o nome do processo. Se você não quiser usarpkill
, use apenas:pgrep '^python*' | xargs kill
fonte
Use pgrep - disponível em várias plataformas:
O pgrep -f retornará todos os PIDs com coincidência "cps_build"
fonte
pgrep
, você também terápkill
. Como sempre, não use, akill -9
menos que você saiba o porquêkill -15
(o padrão) oukill -2
não funcionará.-9
e usa a sintaxe adequada de substituição de comandos modernos. Voto positivo em vez disso; embora, é claro, apkill
resposta seja melhor ainda.-9
realmente significa.Isso retornará apenas o pid
Então, para matar qualquer processo em uma linha:
ou, se você souber o nome exato do processo, também poderá tentar pidof:
Mas, se você não souber o nome exato do processo,
pgrep
seria melhor.Se houver vários processos em execução com o mesmo nome e você desejar eliminar o primeiro, então:
Observe também que, se você estiver preocupado com a distinção entre maiúsculas e minúsculas, poderá adicionar a opção -i, como no grep. Por exemplo:
Mais informações sobre sinais e pgrep em
man 7 signal
ouman signal
eman pgrep
fonte
você pode fazer isso com awk e backtics
$ 2 em awk imprime a coluna 2, e o backtics executa a instrução que é impressa.
Mas uma solução muito mais limpa seria para o processo python armazenar sua identificação de processo em / var / run e então você pode simplesmente ler esse arquivo e matá-lo.
fonte
Minha tarefa era matar tudo o que correspondia ao regexp que é colocado em um diretório específico (depois dos testes de selênio, nem tudo ficava parado). Isso funcionou para mim:
fonte
-9
opção dekill
talvez seja muito agressiva. Isso não permite que eles liberem seus recursos.kill
aceita vários processos para que o loop seja basicamente inútil; e conforme observado em outras partes desta página, você não deve usá-kill -9
lo, a menos que saiba que o processo não responderá apenaskill
.Para eliminar processo por palavra-chave
midori
, por exemplo:kill -SIGTERM $(pgrep -i midori)
fonte
Um método usando apenas
awk
(eps
):Usando o teste de igualdade de cadeias, evito corresponder esse processo.
fonte
fonte
ps
with-o
.Dê -f para pkill
o caminho exato do arquivo .py é
fonte
Comecei a usar algo como isto:
fonte
Matar nossos próprios processos iniciados a partir de um PPID comum é bastante frequente, o pkill associado à
–P
bandeira é um vencedor para mim. Usando o exemplo @ ghostdog74:fonte
Você não precisa da opção de usuário para ps.
fonte
Em alguns casos, eu gostaria de matar processos simultaneamente desta maneira:
Mas acho que é um pouco inapropriado no seu caso (pode estar executando python a, python b, python x ... em segundo plano).
fonte
Se
pkill -f csp_build.py
não-9
interromper o processo, você pode adicionar para enviar um sinal de interrupção que não será ignorado. iepkill -9 -f csp_build.py
fonte
A solução seria filtrar os processos com o padrão exato, analisar o pid e construir uma lista de argumentos para executar os processos de interrupção:
Explicação da documentação:
Exemplo :
fonte
Eu uso isso para matar o Firefox quando ele está sendo executado com scripts e travamento da CPU :) Substitua 'Firefox' pelo aplicativo que você deseja morrer. Estou no shell Bash - OS X 10.9.3 Darwin.
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)
fonte
grep Firefox | awk 'NR == 1 { next } ...'
porawk 'NR == 1 || $11 !~ /Firefox/ { next } ...'
não apenas salva um processo, mas também melhora a precisão. Também não é difícil se livrar dosort | uniq
Awk puro (embora,uniq | sort
é claro, esteja errado - ele perderá as duplicatas que não são adjacentes e ocultará o erro, classificando desnecessariamente a saída deuniq
).Eu uso
gkill processname
, onde gkill é o seguinte script:NOTA: NÃO mata processos que tenham "grep" em suas linhas de comando.
fonte
grep
e outros antipadrões comuns de scripts de shell.O seguinte comando será útil:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
por exemplo.,
ps -elf | grep top
kill -$(ps -elf | grep top| awk {'print $4'})
Se o processo ainda estiver travado, use a extensão "-9" para executar o hardkill, da seguinte maneira:
kill -9 $(ps -elf | grep top| awk {'print $4'})
Espero que ajude...!
fonte
Encontre e mate todos os processos em uma linha no bash.
ps -ef | grep '<exe_name>'
- Fornece a lista de detalhes do processo em execução (uname, pid, etc) que correspondem ao padrão. A lista de saídagrep
também inclui este comando que o pesquisa. Agora, para matar, precisamos ignorar essegrep
processo de comando.ps -ef | grep '<exec_name>' | grep -v 'grep'
- Adicionar outro grep-v 'grep'
remove o processo grep atual.awk
obter o ID do processo sozinho.$(...)
e passe-o para okill
comando, para matar todo o processo.fonte
Você pode usar o comando abaixo para listar o pid do comando. Use top ou melhor, use htop para visualizar todo o processo no linux. Aqui eu quero matar um processo chamado
E verifique o pid. Para matá-los, use o comando kill.
Por exemplo: - é da lista de processos htop.
Isso resolve meus problemas. Sempre esteja preparado para reiniciar o processo se você acidentalmente matar um processo.
fonte