Existe uma forma mais compacta de eliminar trabalhos em segundo plano do que:
for i in {1..5}; do kill %$i; done
Além disso, {1..5} obviamente possui um número mágico codificado, como posso fazer "N" com N sendo o número certo, sem fazer um:
$(jobs | wc -l)
Na verdade, eu uso \ j no PS1 para obter o número de trabalhos gerenciados, isso é equivalente?
kill $(jobs -p)
parece mais fácil.for pid in $(jobs -p); do kill $pid; done
?jobs
quais só funciona se os trabalhos forem numerados consecutivamente. Ah, e “matar tarefas individualmente” não faz sentido: passar vários PIDs para okill
comando faz exatamente a mesma coisa que passá-los separadamente.Respostas:
Para apenas
kill
todos os trabalhos em segundo plano gerenciados porbash
, façaNote-se que uma vez que ambos
jobs
ekill
são incorporadasbash
, você não deve correr em quaisquer erros da lista de argumentos muito longa tipo.fonte
zsh
desqualifica-os como qualquer autoridade sobre o assunto.kill %${(k)^jobdirs}
que é realmente mais longo; se você precisar listar os PIDs, poderá usar ainda mais${${jobstates#*:*:}%%=*}
.>
Use em
xargs
vez do$(jobs -p)
subcomando, porque sejobs -p
estiver vazio, o comando kill falhará.fonte
jobs -p | xargs -rn10 kill
fará melhor sejobs -p
não retornar PIDs. Observe que a-r
opção é extensão GNU.-r
é o formato abreviado da--no-run-if-empty
extensão GNU, para axargs
qual instrui a não executar o comando se stdin não tiver dados.Prefiro verificar se há algum trabalho antes de matá-lo - dessa forma, o script não falhará se não houver nada em execução.
Também é mais curto para digitar. Jogue isso no seu
.bash_profile
:Então corra:
Para matar todos os trabalhos em execução.
fonte
Tenho vários comandos compostos em segundo plano que desejo finalizar normalmente, enviando SIGINT para cada processo, no macOS. Nenhuma das outras soluções funcionou corretamente para isso, então eu vim com isso:
jobs -p
lista os processos em segundo plano iniciados pelo shell atual.xargs -n1
executa o pkill uma vez para cada trabalho.pkill -SIGINT -g
envia SIGINT (o mesmo que ctrl + c) para todos os processos no grupo de processos.fonte
Acho que dependendo da saída
jobs -p
, a solução pode ser um pouco diferente. No meu casoPortanto, não é bom fazer o seguinte.
Por outro lado, a execução
kill $(jobs -p)
funciona, mas envolve muitas mensagens de erro, pois as cadeias não PID também são passadaskill
.Portanto, minha solução é
grep
o PID primeiro e, em seguidaxargs
, use o seguinte:fonte
echo $0
mostra? O quehelp jobs
mostra? A saída ilustrada não é compatível com POSIX ; qualquer implementação dejobs
deve ter uma-p
opção com o comportamento pretendido.jobs -p
só produzi PID. Acabei de aprender que o zsh não é totalmente compatível com POSIX.Parece que
jobs -p | xargs kill
faz o trabalho, no entanto, produz alguma saída indesejada, canalizada para matar. Aqui estou agrupando a saída dejobs -p
ter / não ter o caractere + ou -E depois você pode simplesmente ligar
killjobs
fonte