#!/bin/sh
#This is a process with an id of $$
( sleep 1000 )& #this creates an idle child
( (sleep 1000)& sleep 1000 )& #this creates an idle child and grandchild
wait #this waits for direct children to finish
A execução do acima como ./1.sh &
no meu sistema criou a seguinte árvore de processos:
$ command ps -o pid,ppid,pgrp,stat,args,wchan --forest
PID PPID PGRP STAT COMMAND WCHAN
24949 4783 24949 Ss /bin/bash wait
25153 24949 25153 S \_ /bin/sh ./1.sh sigsuspend
25155 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep
25156 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep
25158 25156 25153 S | \_ sleep 1000 hrtimer_nanosleep
Você pode notar que a árvore tem o mesmo grupo de processos ( PGRP ) de 25153, que é idêntico ao PID do primeiro processo. O shell cria um grupo de processos sempre que você inicia um novo comando no modo interativo (ou com o controle de trabalho ativado explicitamente).
O mecanismo PGRP permite que o shell envie um sinal para todo o grupo de processos de uma vez sem criar uma condição de corrida. Isso é usado para controle do trabalho e quando o script é executado e um trabalho em primeiro plano, para envio:
- (SIG) INTR quando o usuário pressiona C-C
- (SIG) SAIR quando o usuário pressiona C - \
- (SIG) STP quando o usuário pressiona C-Z
Você pode fazer o mesmo fazendo, por exemplo:
kill -INTR -25153
onde INTR é o sinal e 25153 é o grupo de processos para o qual você deseja enviar o sinal. O -
antes do 25153 significa que você está segmentando um ID PGRP em vez de um PID .
No seu caso, o sinal que você deve enviar é -TERM
(término da solicitação). O termo é o sinal padrão kill
envia, no entanto, você precisa especificá-lo explicitamente se estiver segmentando um grupo em vez de um PID .
kill -TERM -25153
Se você quiser eliminar o grupo de processos do último trabalho em segundo plano iniciado, poderá fazer isso:
kill -TERM -$!