Чи можна отримати ідентифікатор групи процесів від / proc?


16

У " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " я бачу всі відповіді, в яких згадується, psі жодна згадка /proc.

Здається, що "ps" не дуже портативний (у версіях Android та Busybox очікуються різні аргументи), і я хочу мати можливість перелічувати файли з pgids за допомогою простих та портативних інструментів.

У /proc/.../status я бачу Tgid:(ідентифікатор групи потоків), Gid:(ідентифікатор групи для безпеки, а не для групування процесів разом), але не PGid:...

Які ще (не використовуються ps) способи отримання pgid з pid?

Відповіді:


24

Ви можете подивитися в полі 5 на виході /proc/[pid]/stat.

$ ps -ejH | grep firefox
 3043  2683  2683 ?        00:00:21   firefox

$ < /proc/3043/stat sed -n '$s/.*) [^ ]* [^ ]* \([^ ]*\).*/\1/p'
2683

Від man proc:

/proc/[pid]/stat
              Status information about the process.  This is used by ps(1).  It is defined in /usr/src/linux/fs/proc/array.c.

              The fields, in order, with their proper scanf(3) format specifiers, are:

              pid %d      The process ID.

              comm %s     The filename of the executable, in parentheses.  This is visible whether or not the executable is swapped out.

              state %c    One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D is waiting in
                          uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging.

              ppid %d     The PID of the parent.

              pgrp %d     The process group ID of the process.

              session %d  The session ID of the process.

Зауважте, що ви не можете використовувати:

awk '{print $5}'

Тому що цей файл не є порожнім розділеним списком. Друге поле (назва процесу може містити пробіли або навіть символи нового рядка). Наприклад, більшість ниток firefoxтипових символів мають пробіли.

Тому потрібно надрукувати 3-е поле після останнього появи )символу там.


Зауважте, що awk '{print $5}'це не гарантовано дасть вам правильну відповідь, оскільки ім'я процесу (друге поле) може містити пробіли або символи нового рядка.
Стефан Шазелас

Як надійно розібрати /proc/.../stat?
Ві.

3
@Vi, дивіться цю відповідь perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" абоp=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Стефан Шазелас

@StephaneChazelas: Спасибі, я оновив свою відповідь!
cuonglm

Це більше імен процесів, ніж імен файлів. Зазвичай проблема виникає з процесами, які змінюють своє ім'я (від того, який вони отримують від імені останнього файлу, який вони виконували).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.