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.
^Znão trabalha em segundo plano, ele os interrompe Um subsequente bgrealiza 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 syncou 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 jobscomando 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 trabalhonpode 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,%cerefere-se a umcetrabalho 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 caracteresceem 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
%1e %%- 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 psou talvez jobs -l, e depois redigitar o PID, o que é tedioso.
while truecom 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 pythonou killall javaenquanto tiver algo útil em execução no sistema.