Como matar todos os empregos no bash?

3

Então, eu tenho alguns trabalhos como este:

sleep 30 | sleep 30 &

O jeito natural de pensar seria:

kill 'jobs -p'

Mas isso mata apenas o primeiro sleep mas não o segundo.

Isso elimina os dois processos:

kill %1

Mas isso só mata no máximo um trabalho se houver muitos desses trabalhos em andamento.

Ele não deve matar processos com o mesmo nome, mas não executar neste shell.

    
por user23013 02.08.2017 / 19:20

4 respostas

3

Use isto:

pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"

jobs -p imprime o PID dos líderes do grupo de processos. Ao fornecer um PID negativo para kill , eliminamos todos os processos pertencentes a esse grupo de processos ( man 2 kill ). "${pids[@]/#/-}" apenas nega cada PID armazenado na matriz pids .

    
por 02.08.2017 / 22:22
3

Uma versão um pouco mais curta da resposta de xhienne, mas não pura-bash:

jobs -p | xargs -I{} kill -- -{}
    
por 02.08.2017 / 23:18
2

Você pode usar pkill e pgrep para eliminar uma lista de nomes de processos.

Da página do manual:

pgrep looks through the currently running processes and lists the process IDs which matches the selection criteria to stdout. All the criteria have to match. For example, pgrep -u root sshd will only list the processes called sshd AND owned by root. On the other hand, pgrep -u root,daemon will list the processes owned by root OR daemon. pkill will send the specified signal (by default SIGTERM) to each process instead of listing them on stdout.

Um exemplo usando pgrep , pkill ,

$ pgrep -l script.sh
12406 script.sh
12425 script.sh

$ pkill $(pgrep script.sh)

$ cat signal-log
Name: ./script.sh Pid: 12406 Signal Received: SIGTERM
Name: ./script.sh Pid: 12425 Signal Received: SIGTERM
    
por 02.08.2017 / 19:51
1

Use kill $( jobs -p ) ... eu adoro isso.

    
por 19.03.2018 / 11:12