Analisa a saída pstree para listar os PIDs pai e filho de um determinado nome de processo

0

Estou executando duas instâncias de um programa chamado SMU , portanto, haverá dois processos separados com o mesmo nome SMU . E cada processo de SMU criará um (pode ser mais de 1) processo filho, portanto, agora haverá 4 processos com o mesmo nome de processo como mostrado abaixo (onde 22313, 23835 são processos pai de duas instâncias diferentes).

22313 pts/10   00:35:00 SMU
22314 pts/10   00:35:06 SMU
23835 pts/6    00:25:02 SMU
23836 pts/6    00:24:56 SMU

Eu quero escrever um código C separado onde eu quero criar uma lista vinculada por uma instância de SMU para listar todos os PIDs dessa árvore de processos.
Então eu preciso saber como posso encontrar quantas instâncias estão em execução ?, como encontrar PIDs com o mesmo nome ?, qual processo pertence a qual grupo de processos e se o processo é filho ou pai ?.

Existe alguma API C para fazer o trabalho por mim e, se eu tiver que usar pstree , como posso usá-la para atender a minha exigência.

    
por reddi hari 15.10.2018 / 08:29

1 resposta

2

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.

    
por 15.10.2018 / 09:35