Como matar o (último - 1) PID com o bash

2

Eu sei como matar o último processo com

 kill $!

No entanto, eu gostaria de matar o último processo −1, ou seja, não o último, mas o último antes do último.

Eu tentei

 kill $$(($! -1))

mas isso não funcionou.

    
por musicisme 13.05.2013 / 19:40

1 resposta

7

resumo:

Você deve usar jobs para listar e usar kill %n para anular o segundo processo em segundo plano, e se o seu bash o suportar: kill %-1 matará o n-1'th processo em segundo plano.

detalhes:

# find / -print >/dev/null 2>/dev/null &
[1] 1291234
# find /./ -print >/dev/null 2>/dev/null &
[2] 2162424
# find /././ -print >/dev/null 2>/dev/null &
[3] 680176
#
# jobs
[1]   Running                 find / -print >/dev/null 2>/dev/null &
[2]-  Running                 find /./ -print >/dev/null 2>/dev/null &
[3]+  Running                 find /././ -print >/dev/null 2>/dev/null &
# kill %2  # or kill %-1  if your version of bath supports it
#
[2]-  Terminated              find /./ -print >/dev/null 2>/dev/null
# jobs
[1]-  Running                 find / -print >/dev/null 2>/dev/null &
[3]+  Running                 find /././ -print >/dev/null 2>/dev/null &
#

Observe que a "entrada" adicional necessária para ver a mensagem [2]- Terminated find /./ -print >/dev/null 2>/dev/null (mostrada apenas antes do próximo prompt)

Agora, se o seu bash suporta a notação kill %-n : é fácil:

kill %-1  # will kill not the n'th (or last), but the n-1'th backgrounded process

Mas se o seu bash não suporta kill %-1 : Aqui está uma tentativa (excessivamente complexa ...) de automação (que só deve matar se houver um n-1 ° trabalho a ser morto ... esperançosamente)

jobs \
  | awk 'BEGIN {cur="";}

           /./ { last=cur ; cur=$0 ; }

           END { if ( last != "")
                 { print last ;} }' \
  | tr -d '[]+-' \
  | awk '{ print $1 }' \
  | xargs -I __ echo kill %__

(tire o "eco" assim que tiver certeza de que faz o que quiser ...)

    
por 13.05.2013 / 19:52