Como eu mato a última tarefa em segundo plano gerada no linux?
Exemplo:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Como eu mato a última tarefa em segundo plano gerada no linux?
Exemplo:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Respostas:
Há uma variável especial para isso no bash:
kill $!
$! expande para o PID do último processo executado em segundo plano.
^Z
não trabalha em segundo plano, ele os interrompe Um subsequente bg
realiza o 'segundo plano' real (retoma a execução em segundo plano) e depois $!
funciona como esperado.
????
que um ou mais comandos sejam executados após a eliminação, se algum desses comandos depender do trabalho realizado pelo processo em segundo plano, lembre-se de todas as tarefas de limpeza ou conclusão que o processo em segundo plano possa executar em um manipulador de sinal após recebendo um sinal (detectável). É melhor adicionar um wait
(seguido talvez por um sync
ou mesmo a sleep <n>
) antes do primeiro desses comandos 'dependentes'.
Você pode matar pelo número do trabalho. Quando você coloca uma tarefa em segundo plano, verá algo como:
$ ./script &
[1] 35341
Esse [1]
é o número do trabalho e pode ser referenciado como:
$ kill %1
$ kill %% # Most recent background job
Para ver uma lista dos números dos trabalhos, use o jobs
comando Mais de man bash
:
Existem várias maneiras de se referir a um trabalho no shell. O personagem
%
introduz um nome de trabalho. O número do trabalhon
pode ser chamado de%n
. Um trabalho também pode ser referido usando um prefixo do nome usado para iniciá-lo ou uma substring que aparece em sua linha de comando. Por exemplo,%ce
refere-se a umce
trabalho parado . Se um prefixo corresponder a mais de um trabalho, o bash reportará um erro. O uso%?ce
, por outro lado, refere-se a qualquer trabalho que contenha a cadeia de caracteresce
em sua linha de comando. Se a substring corresponder a mais de um trabalho, o bash reportará um erro. Os símbolos%%
e%+
consulte a noção do shell do trabalho atual, que é o último trabalho parado enquanto estava em primeiro plano ou iniciado em segundo plano. O trabalho anterior pode ser referenciado usando%-
. Na saída referente aos trabalhos (por exemplo, a saída do comando jobs), o trabalho atual é sempre marcado com a+
e o trabalho anterior com a-
. Um único%
(sem especificação de trabalho que o acompanha) também se refere ao trabalho atual.
set -m
), ele é destinado ao uso interativo. Veja stackoverflow.com/questions/690266/… também
%1
e %%
- especialmente. Algumas coisas não morrem no Ctrl-C, então você precisa pressioná-las com Ctrl-Z e depois kill -9 %%
. Um exemplo em que eu achei útil é: while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- Ctrl-C levará você à próxima iteração do loop. Antes eu tinha que fazer ps
ou talvez jobs -l
, e depois redigitar o PID, o que é tedioso.
while true
com while sleep 1
. Isso fornecerá um pequeno atraso antes da reinicialização, se você puder conviver com isso, e se pressionar ctrl-c duas vezes, o segundo interromperá o sono, encerrando-o com uma saída diferente de zero e interrompendo o ciclo.
Isso deve matar todos os processos em segundo plano:
jobs -p | xargs kill -9
kill -9 %%
é menos digitação :)
essa é uma resposta fora do tópico, mas, para quem está interessado, talvez seja valiosa.
Como na resposta de John Kugelman,% está relacionado à especificação de cargo. como encontrar isso com eficiência? use o comando less's & pattern , parece que o homem usa menos pager (não tenho certeza), no man bash digite &% e digite Enter mostrará apenas as linhas que contêm '%', para refazer tudo, digite &. depois pressione Enter.
Basta usar o comando killall:
killall taskname
para mais informações e opções mais avançadas, digite "man killall".
killall python
ou killall java
enquanto tiver algo útil em execução no sistema.