linux: matar tarefa em segundo plano


194

Como eu mato a última tarefa em segundo plano gerada no linux?

Exemplo:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
Como isso pode não estar relacionado à programação? Programação Bash não está programando?
22139 flybywire

6
Isso está na região de sobreposição entre SO e SU, mas acho que se encaixa melhor aqui no SO. Meu critério para pensar dessa maneira é que, se o @flybywire estiver fazendo isso em um script, é programação. Se ele apenas quisesse fazer isso na linha de comando, eu diria que pertence ao SU.
Bill o Lagarto

10
O script de shell também está programado.
Cletus

Respostas:


234

Há uma variável especial para isso no bash:

kill $!

$! expande para o PID do último processo executado em segundo plano.


68
@ polm23; não, ^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.
falstro

Supondo ????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'.
Ack

2
Para conclusão: como um único% também se refere ao trabalho atual, você pode matar o trabalho parado (^ z) com "kill%". Eu uso isso quase sempre depois de ^ z.
t3o 13/03/19

Isso só funciona se você tiver o controle de tarefas ativado, que está ativado por padrão em shells interativos (embora, como você esteja se referindo ao uso do ctrl-z, acho que você também esteja se referindo ao uso de um shell interativo) - mas isso foi delineado em outras respostas aqui, não tenho certeza por que isso é "para ser completo" :)
falstro

289

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 trabalho npode 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 um cetrabalho 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 caracteres ceem 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.


Para o registro, acho que isso só funciona se o controle de trabalho estiver ativado. Embora eu ache que você possa ativá-lo em scripts ( set -m), ele é destinado ao uso interativo. Veja stackoverflow.com/questions/690266/… também
falstro

9
Símbolos muito úteis, estes %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.
Tomasz Gandor

Existe um para todos os trabalhos?
precisa saber é o seguinte

3
@TomaszGandor É por isso que você pode querer substituir 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.
falstro 31/05

45

O comando a seguir fornece uma lista de todos os processos em segundo plano na sua sessão, junto com o pid. Você pode usá-lo para matar o processo.

jobs -l

Exemplo de uso:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

Isso deve matar todos os processos em segundo plano:

jobs -p | xargs kill -9

1
Isto é o que eu usaria antes, mas kill -9 %%é menos digitação :)
Tomasz Gandor

4
@TomaszGandor Isso matará apenas o trabalho atual, ou seja, o último trabalho parado em primeiro plano ou iniciado em segundo plano. O comando na resposta matará TODOS os trabalhos.
Bitek


2
skill doB

skill é uma versão do comando kill que permite selecionar um ou vários processos com base em um determinado critério.


0

Você precisa do pid ... use "ps -A" para encontrá-lo.


0

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.


-3

Basta usar o comando killall:

killall taskname

para mais informações e opções mais avançadas, digite "man killall".


4
Eu acho que killall é um pouco agressivo quando você realmente tem acesso fácil ao PID. E perigoso também, especialmente se você é root #
Dave Vogt

3
Não é muito útil, se você precisar , killall pythonou killall javaenquanto tiver algo útil em execução no sistema.
Tomasz Gandor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.