Listar ids de job (em vez disso ids de processo)

3

O comando shell jobs suporta a opção -p para obter apenas a lista de IDs de processo. Existe uma maneira fácil de obter apenas uma lista de ids de trabalho? (Eu sei que existe, mas eu não sou realmente um cara de concha (ainda)).

Isso seria muito útil para kill , já que matar um ID de trabalho em vez de um ID de processo também parece matar todos os processos filhos.

    
por Zardoz 29.04.2011 / 00:50

2 respostas

4

Você pode fazer algo assim:

# create some background jobs
sleep 10 & sleep 10 & sleep 10 & sleep 10 & 
jobs | awk -F '[][]' '{print "%" $2}'

Isso retornará

%1
%2
%3
%4

que eu assumo é o que você procura.

    
por 29.04.2011 / 03:13
3

This would be very handy for kill, as killing a job id instead of a process id seems to also kill all child processes.

Você pode fazer isso de uma maneira diferente.

Quando ele imprime o pid, você pode matá-lo e a todos os seus filhos eliminando seu grupo de processos .

Você faz isso negando o pid, por exemplo

$ cat &
[1] 21273
$ kill -- -21273

Você precisa escrever -- ou senão -pid é interpretado como um sinal (por exemplo, como kill -9 ).

Exemplo:

$ man ls &
[1] 22267

$ ps j | head -1; ps j | grep 22267
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
18968 22267 22267 18968 pts/2    22327 T      500   0:00 man ls
22267 22281 22267 18968 pts/2    22327 T      500   0:00 /bin/sh /usr/bin/nroff -mandoc -Tutf8
22267 22282 22267 18968 pts/2    22327 T      500   0:00 less
22281 22286 22267 18968 pts/2    22327 T      500   0:00 groff -mtty-char -Tutf8 -mandoc
22286 22287 22267 18968 pts/2    22327 T      500   0:00 troff -mtty-char -mandoc -Tutf8
22286 22288 22267 18968 pts/2    22327 T      500   0:00 grotty

$ kill -- -22267
[1]+  Terminated              man ls

$ ps j | grep 22267

$
    
por 29.04.2011 / 03:31