O cenário 2 pode ser corrigido assim, sem o uso de setsid
:
sudo -b command
Isso criará um novo grupo de processos, diretamente abaixo do processo de inicialização do sistema, incluindo o comando sudo
.
Uma palavra de recomendação: se alguém inicia um grupo de processos como este com subprocess.Popen
do Python, o PID
( subprocess.Popen(...).pid
) do objeto resultante NÃO pode ser usado para determinar o PGID
para eventual uso em um padrão como kill -9 -- -{PGID}
(ele eliminará o interpretador Python em vez do grupo de processos recém gerado). Minha solução alternativa (requer psutil
):
import os
import psutil
import subprocess
def __get_pid__(cmd_line_list):
for pid in psutil.pids():
proc = psutil.Process(pid)
if cmd_line_list == proc.cmdline():
return proc.pid
return None
cmd = ['sudo', '-b', 'command']
cmd_proc = subprocess.Popen(cmd)
print('Wrong PGID: %d' % os.getpgid(cmd_proc.pid))
print('Right PGID: %d' % os.getpgid(__get_pid__(cmd)))