O seguinte é um pouco mais simples e tem a vantagem adicional de ignorar números nos nomes dos comandos:
pstree -p $pid | grep -o '([0-9]\+)' | grep -o '[0-9]\+'
Ou com o Perl:
pstree -p $pid | perl -ne 'print "$1\n" while /\((\d+)\)/g'
Estamos procurando números entre parênteses para que, por exemplo, não damos 2 como um processo filho quando nos deparamos com gif2png(3012)
. Mas se o nome do comando contiver um número entre parênteses, todas as apostas serão desativadas. Há apenas até agora o processamento de texto pode levá-lo.
Então, também acho que os grupos de processos são o caminho a percorrer. Se você quiser que um processo seja executado em seu próprio grupo de processos, você pode usar a ferramenta 'pgrphack' do pacote Debian 'daemontools':
pgrphack my_command args
Ou você pode voltar para o Perl:
perl -e 'setpgid or die; exec { $ARGV[0] } @ARGV;' my_command args
A única ressalva aqui é que os grupos de processos não aninham, portanto, se algum processo estiver criando seus próprios grupos de processos, seus subprocessos não estarão mais no grupo que você criou.