Isso não é possível em geral. Pode ser possível no seu caso específico.
Logo depois de executar um comando de segundo plano, o ID do processo pode ser descoberto no pai . Se você executar um comando em primeiro plano (um filho do programa mestre) e esse comando executar um comando em segundo plano (um neto do programa mestre), o programa mestre não terá visibilidade direta em seu neto: tudo o que sabe é que é executar um processo filho, que agora foi encerrado.
O kernel mantém o controle dos relacionamentos filho-pai-processo. Você pode executar ps -o ppid= -p $pid
para ver o ID do processo pai do processo cujo ID é $pid
. O kernel não acompanha o avô de um processo. Além disso, se o pai morrer, o processo é adotado pelo init (processo número 1), portanto, seu ID de processo pai será 1 daquele ponto em diante.
Existem vários outros atributos do processo que são herdados e que você pode tentar acompanhar. No entanto, o neto pode se divorciar de qualquer um desses atributos. Se o neto tiver a intenção de ser executado como um daemon, ele provavelmente tentará se isolar o máximo possível (do filho intermediário ou do próprio neto), de modo que ele não fique vinculado à sua sessão interativa e não o faça. arriscar ser pego em qualquer coisa que aconteça com esta sessão.
Você pode procurar processos no mesmo grupo de processos que o processo atual ( ps -o pgid=
)). Isso detectará qualquer outro processo iniciado no mesmo grupo de processos, mas, ao contrário, perderá o neto se ele for executado em seu próprio grupo de processos devido a uma chamada para setpgid
ou setpgrp
no filho ou no neto, que os daemons fazem. / p>
Você pode procurar processos no mesmo ID de sessão que o processo atual ( ps -o sid=
)). Isso detectará qualquer outro processo iniciado dentro do mesmo ID de sessão, mas, ao contrário, perderá o neto se ele for executado em sua própria sessão devido a uma chamada para setsid
no filho ou no neto, que os daemons fazem.
Você pode abrir um arquivo temporário e procurar por processos que tenham esse arquivo aberto ('fuser' $ tmpfile "). Isso é mais confiável porque ele só captura os processos iniciados a partir da parte do processo mestre que tinha esse arquivo aberto, ele não detectará quaisquer outros componentes do processo mestre. No entanto, como outras soluções, o neto perderá se ele ou o filho intermediário fechar os descritores de arquivos que não utilizou, o que os daemons fazem.
A maioria dos daemons tem uma opção de linha de comando para permanecer em primeiro plano. Você pode então executar daemon --foreground & daemon_pid=$!
, e cabe a você tomar precauções para evitar que o daemon seja pego na saída da sessão ( nohup daemon --foreground </dev/null >daemon.log 2>&1 &
é um bom começo).