Como podemos matar todos os trabalhos em segundo plano (em execução ou não) no shell atual?

0

De link

To just kill all background jobs managed by bash, do

kill $(jobs -p)

kill $(jobs -p) mata apenas as tarefas em segundo plano "em execução" no shell atual, mas não as tarefas em segundo plano no shell que estão em "parado" ou em outros estados?

Como podemos matar todos os trabalhos em segundo plano no shell atual, independentemente de estarem em execução, parados ou em outros estados?

Por exemplo, criei duas tarefas interrompidas, executando less e, em seguida, ctrl+z :

$ ps | less

[1]+  Stopped                 ps | less
$ less recover_jobs.sh

[2]+  Stopped                 less recover_jobs.sh

$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh
$ jobs -p
2753
2842

$ kill $(jobs -p)
bash: kill: (2753) - No such process
$ kill 2754
$ kill 2842
$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh

$ fg 1
ps | less
Terminated
$ fg 2
less recover_jobs.sh
Terminated

Eu estava me perguntando por que:

  • kill $(jobs -p) não elimina nenhum trabalho stopped ,

  • jobs -p não mostra o pid 2754 do trabalho parado | less , mas o pid 2753 do trabalho feito ps ,

  • kill 2754 e kill 2842 não eliminam os trabalhos parados por | less e less recover_jobs.sh e
  • quando eu fg os trabalhos interrompidos, eles são mostrados imediatamente Terminated , mas não antes de eu fg deles?

Obrigado.

    
por Tim 05.05.2018 / 06:30

1 resposta

1

kill $( jobs -p ) enviaria o sinal TERM para todos os jobs , independentemente de estarem ou não em execução. Um trabalho pode incluir vários processos, mas apenas o primeiro processo em cada trabalho seria sinalizado (veja mais abaixo).

Sua primeira e terceira e última pergunta têm a mesma resposta. Um trabalho parado não recebe nenhum sinal. Um manipulador de sinal (mesmo o padrão) é executado no processo e o processo é interrompido . Os sinais são entregues quando o trabalho é retomado.

Quanto à segunda questão, acredito que jobs -p apenas forneça o ID do processo do primeiro processo, enquanto jobs -l lista todos os processos pertencentes a todos os trabalhos. Matar o primeiro processo de um pipeline fecha o descritor de arquivo do qual o próximo processo está lendo, solicitando um fim de arquivo em sua próxima tentativa de leitura.

    
por 05.05.2018 / 14:13