Tentar analisar a saída de um comando voltado para o usuário geralmente se torna a parte mais frágil de seu programa, por uma grande margem. (Especialmente algo tão complexo quanto a saída pstree.) A saída é para humanos e não é adequada para consumo de computador. Ele pode mudar entre as versões do programa ou dependendo da localidade do sistema (data, idioma, conjunto de caracteres) ou dependendo das personalizações locais do usuário. Não analisar o pstree.
No Linux, o principal método para enumerar os processos - a origem desta informação - é listar os subdiretórios de / proc apenas com números nomes. Cada um desses diretórios representa um processo e seu nome é o PID. Seu pai pode ser determinado lendo /proc/<pid>/status
e procurando o atributo PPid:
(ao lado de Pid:
).
Para fazer isso de maneira mais conveniente, você pode usar uma das APIs fornecidas por libprocps : nova API - procps_proctab_read()
ou API antiga - readproc()
, readproctab3()
.
Para gerenciar várias instâncias de um serviço, use um gerenciador de serviços. A maioria dos sistemas Linux inclui um (chamado systemd). Ele automaticamente rastreia quais processos pertencem a qual serviço, para que comandos como systemctl restart smu@foo
(assim como as APIs C correspondentes) sempre escolham os PIDs corretos.