Isso porque você não está imprimindo o ID do grupo de processos (PGID), está imprimindo o "código do grupo de processos tty de controle", tpgid. Conforme explicado em man ps
:
tpgid TPGID ID of the foreground process group on the tty
(terminal) that the process is connected to, or
-1 if the process is not connected to a tty.
Então, o que você está vendo é o PID do processo em primeiro plano, que, no seu caso, é o programa ps
:
$ sleep 1000 &
[1] 6745
$ ps ax -O tpgid | grep -E 'sleep|ps a'
6745 7136 S pts/1 00:00:00 sleep 1000
7136 7136 R pts/1 00:00:00 ps ax -O tpgid
7137 7136 S pts/1 00:00:00 grep --color -E sleep|ps a
como você pode ver acima, o valor de tpgid impresso é o PID do processo ps
. O que você está procurando é pgid
, não tpgid
:
pgid PGID process group ID or, equivalently, the process ID
of the process group leader. (alias pgrp).
$ ps ax -O pgid | grep -E 'sleep|ps a'
8414 8414 S pts/1 00:00:00 sleep 1000
8656 8656 R pts/1 00:00:00 ps ax -O pgid
8657 8656 S pts/1 00:00:00 grep --color -E sleep|ps a
Naturalmente, como você não está realmente executando nenhum grupo de processos (isso acontece quando, por exemplo, um script chama outros scripts), o PGID para sleep
é o mesmo que seu PID. No entanto, você pode matá-lo dessa maneira se quiser:
$ kill -9 -8414
$ ps ax -O pgid | grep -E 'sleep|ps a'
10065 10065 R pts/1 00:00:00 ps ax -O pgid
10066 10065 S pts/1 00:00:00 grep --color -E sleep|ps a
[1]+ Killed sleep 1000
Um exemplo mais informativo seria executar um script como este:
#!/bin/bash
sleep 1000 &
sleep 1000 &
sleep 1000 &
sleep 1000
Se eu salvar isso como foo.sh
e executá-lo, os vários comandos sleep
terão o mesmo PGID:
$ foo.sh &
[1] 13555
$ ps ax -O pgid | grep -P '[s]leep|[f]oo.sh'
13555 13555 S pts/1 00:00:00 /bin/bash /home/terdon/scripts/foo.sh
13556 13555 S pts/1 00:00:00 sleep 1000
13557 13555 S pts/1 00:00:00 sleep 1000
13558 13555 S pts/1 00:00:00 sleep 1000
13559 13555 S pts/1 00:00:00 sleep 1000
Assim, cada processo filho está no grupo de processos do pai, foo.sh
. Se nós agora matarmos o grupo de processos, todos os processos sairão:
$ kill -9 -13555
$ ps ax -O pgid | grep -P '[s]leep|[f]oo.sh'
[1]+ Killed foo.sh