Разобрать вывод pstree для вывода списка родительских и дочерних PID данного имени процесса

431
reddi hari

Я запускаю два экземпляра вызываемой программы SMU, следовательно, будут два отдельных процесса с одинаковыми именами SMU. И каждый SMUпроцесс создаст один (может быть более 1) дочерний процесс, следовательно, теперь будет 4 процесса с тем же именем процесса, как показано ниже (где 22313, 23835 - родительские процессы двух разных экземпляров).

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 

Я хочу написать отдельный код C, в котором я хочу создать один связанный список для каждого экземпляра, SMUчтобы перечислить все PID этого дерева процессов.
Поэтому мне нужно знать, как узнать, сколько экземпляров запущено ?, как найти PID с одинаковым именем ?, какой процесс принадлежит какой группе процессов и является ли этот процесс дочерним или родительским ?.

Существуют ли какие-либо API-интерфейсы C, чтобы выполнить эту работу за меня, и если я должен использовать их pstree, как я могу использовать их для удовлетворения своих требований.

0

1 ответ на вопрос

2
grawity

Попытка анализа выходных данных пользовательской команды обычно становится самой хрупкой частью вашей программы с большим отрывом. (Особенно такой сложный, как вывод pstree.) Вывод предназначен для людей и не подходит для потребления компьютером. Он может меняться в зависимости от версии программы или в зависимости от локали системы (дата, язык, набор символов) или в зависимости от локальных настроек пользователя. Не разбирай pstree.

В Linux, основной метод для перечисления процессов - на источник этой информации - это список подкаталогов / прока с числовыми-только именами. Каждый такой каталог представляет процесс, а его имя - PID. Его родитель может быть определен путем чтения /proc/<pid>/statusи поиска PPid:атрибута (рядом с Pid:самим собой).

Для того, чтобы сделать это более удобно, вы можете использовать один из API - интерфейсов, предоставляемых libprocps : новый API - procps_proctab_read()или старый API - readproc(), readproctab3().

Для управления несколькими экземплярами службы используйте диспетчер служб. Большинство систем Linux включают одну (называемую systemd). Он автоматически отслеживает, какие процессы принадлежат какому сервису, поэтому такие команды, как systemctl restart smu@foo(а также соответствующие API-интерфейсы C), всегда выбирают правильные PID.

Спасибо за ответ, но я не смог найти никаких man-страниц для этих API, хотя ~ libprocps ~ установлен в моей системе, могу ли я знать, как их использовать reddi hari 5 лет назад 0
Старый API не имеет документов; и, к сожалению, то, что я думал, было документами для «нового API», кажется, только будущий план для одного. Так что вы, похоже, вернулись к ручному копанию `/ proc`. grawity 5 лет назад 0
Это хороший план, чтобы прочитать каждый файл `status` каждого каталога процесса в` / proc` и найти строку `SMU`, чтобы я получил всю необходимую информацию reddi hari 5 лет назад 0

Похожие вопросы