Apakah mungkin untuk mendapatkan ID grup proses dari / proc?

16

Dalam " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " Saya melihat semua jawaban menyebutkan psdan tidak ada yang menyebutkan /proc.

"ps" tampaknya tidak terlalu portabel (versi Android dan Busybox mengharapkan argumen yang berbeda), dan saya ingin dapat membuat daftar pids dengan pgids dengan alat sederhana dan portabel.

Di /proc/.../status saya melihat Tgid:(utas ID grup), Gid:(id grup untuk keamanan, bukan untuk proses pengelompokan bersama), tetapi tidak PGid:...

Apa cara lain (tidak menggunakan ps) untuk mendapatkan pgid dari pid?

Vi.
sumber

Jawaban:

24

Anda dapat melihat bidang ke-5 dalam output dari /proc/[pid]/stat.

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

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

Dari 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.

Perhatikan bahwa Anda tidak dapat menggunakan:

awk '{print $5}'

Karena file itu bukan daftar yang dipisahkan kosong. Bidang kedua (nama proses dapat berisi karakter kosong atau bahkan baris baru). Misalnya, sebagian besar utas firefoxbiasanya memiliki karakter spasi dalam namanya.

Jadi, Anda perlu mencetak bidang ke-3 setelah kemunculan )karakter terakhir di sana.

cuonglm
sumber
Catatan yang awk '{print $5}'tidak dijamin memberi Anda jawaban yang benar karena nama proses (bidang kedua) dapat berisi spasi atau karakter baris baru.
Stéphane Chazelas
Bagaimana cara menguraikan /proc/.../stat?
Vi.
3
@ Vi, lihat jawaban itu perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" ataup=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas
@StephaneChazelas: Terima kasih, saya telah memperbarui jawaban saya!
cuonglm
Ini lebih banyak nama proses daripada nama file. Masalahnya biasanya akan terjadi dengan proses yang mengubah nama mereka (dari yang mereka dapatkan dari nama file terakhir yang mereka jalankan).
Stéphane Chazelas