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
. Como eu entendi, kill 0
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?
process
kill
process-groups
Arma de fogo
fonte
fonte
SIGTERM
para o processo, o que foi feito. Oman
comando optou por ignorá-lo.ps -j
para ver os grupos de processos.kill -0
(nota o traço), que é um tópico diferente, em StackOverflow e aqui em Unix.SE .Respostas:
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 interativo de tarefas de shell é o principal motivo de sua existência).
Você notará que, ao digitar 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 é alcançado com grupos de processos. Um trabalho é 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 os IDs de grupo de processos e de sessão com
ps -j
(j
para Jcontrole de ob).Para matar o grupo de processos do PGID
$x
, você faz:kill 0
mata o grupo de processos do chamador.Observe que, se você fizer
/bin/kill 0
:, o shell iniciará um novo trabalho para executar essekill
comando, ekill
somente se matará.kill
normalmente é um shell embutido, portantokill
, 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:
Acima
sleep
eps
estão em dois grupos de processos diferentes, um em segundo plano, um em primeiro plano e eles são diferentes do grupo de processos do shell.Você poderia fazer:
O shell interativo iniciaria um novo grupo de processos para esse subshell, e o subshell e man (e os outros comandos iniciados por man como seu pager, groff ...) estariam no mesmo grupo de processos, portanto
kill 0
, trabalhariam lá. (o que foisleep
dito acima é para dar tempo suficiente para o pager iniciar, para que possamos vê-lo naps -j
saída antes de matá-lo).fonte
kill -- -$x
na verdade, dizbash: kill: (-63531) - No such process
no lançamento do bash 5.0.11 (1) no MacOS 10.14, mas é certo que o processo existe e está em execução.pkill -P
funciona bemps -j
para descobrir sobre pgids