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.
@ 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.
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.
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.
Respostas:
Há uma variável especial para isso no bash:
$! expande para o PID do último processo executado em segundo plano.
fonte
^Z
não trabalha em segundo plano, ele os interrompe Um subsequentebg
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 umwait
(seguido talvez por umsync
ou mesmo asleep <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:
Esse
[1]
é o número do trabalho e pode ser referenciado como:Para ver uma lista dos números dos trabalhos, use o
jobs
comando Mais deman bash
:fonte
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 depoiskill -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 fazerps
ou talvezjobs -l
, e depois redigitar o PID, o que é tedioso.while true
comwhile 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.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.
Exemplo de uso:
fonte
Isso deve matar todos os processos em segundo plano:
fonte
kill -9 %%
é menos digitação :)skill
é uma versão do comando kill que permite selecionar um ou vários processos com base em um determinado critério.fonte
Você precisa do pid ... use "ps -A" para encontrá-lo.
fonte
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.
fonte
Basta usar o comando killall:
killall taskname
para mais informações e opções mais avançadas, digite "man killall".
fonte
killall python
oukillall java
enquanto tiver algo útil em execução no sistema.