O que o kill faz na verdade? [fechadas]

18

No man page , diz:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

E eu tentei assim no bash:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Aqui 0 é usado como pid . Pelo que entendi, kill 0 irá matar todos os processos no processo atual, o que inclui pid15247 . No entanto, não fez nada neste exemplo. Alguém tem idéias sobre como usá-lo?

    
por Firegun 11.03.2013 / 06:05

1 resposta

24

Como diz, ele envia o sinal para todos os membros do grupo de processos do chamador.

Os grupos de processos são usados para implementar o controle de tarefas no shell (eles podem ser usados para outras coisas, mas o controle de tarefas do shell interativo é o principal motivo de sua existência).

Você notará que quando você digita Ctrl-C , todos os processos dos trabalhos atuais são eliminados, não apenas o que os iniciou. Além disso, isso não mata os trabalhos em segundo plano.

Isso é conseguido com grupos de processos. Um job é um grupo de processos iniciados por um shell que o shell pode colocar em segundo plano ou em primeiro plano (definido como o grupo de processos em primeiro plano do terminal ou não) e matar como um todo.

Você pode descobrir sobre IDs de grupos de processos e ids de sessão com ps -j ( j para o controle J ob).

Para eliminar o grupo de processos do PGID $x , você faz:

kill -- "-$x"

kill 0 mata o grupo de processos do chamador.

Observe que, se você fizer isso: /bin/kill 0 , o shell iniciará um novo trabalho para executar o comando kill , portanto, kill só se matará.

kill normalmente é um shell embutido, então kill irá matar o grupo de processos do shell.

No entanto, quando o shell é interativo, é o processo que gerencia os grupos de processos, portanto, normalmente não há outro processo no grupo de processos do shell. Todos os processos iniciados pelo shell estão em outros grupos de processos:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Acima, sleep e ps estão em dois grupos de processos diferentes, um em segundo plano, um em primeiro plano e são diferentes do grupo de processos do shell.

Você pode fazer isso:

(man kill & sleep 1; ps -j; kill 0)

O shell interativo iniciaria um novo grupo de processos para esse subshell, e tanto o subshell quanto o man (e os outros comandos iniciados pelo man como seu pager, groff ...) estariam no mesmo grupo de processos, então kill 0 iria trabalhar lá. (o sleep acima é para dar tempo suficiente para o pager iniciar, então podemos vê-lo na saída ps -j antes de matá-lo).

    
por 11.03.2013 / 12:06