เป็นไปได้หรือไม่ที่จะรับ ID กลุ่มกระบวนการจาก / proc


16

ใน " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " ผมเห็นคำตอบทั้งหมดกล่าวขวัญและไม่มีการกล่าวขวัญps/proc

"ps" ดูเหมือนจะไม่พกพาได้มาก (รุ่น Android และ Busybox คาดว่าจะมีข้อโต้แย้งที่แตกต่างกัน) และฉันต้องการแสดง pids ด้วย pgids ด้วยเครื่องมือที่ง่ายและพกพาได้

ใน /proc/.../status ฉันเห็นTgid:(ID กลุ่มเธรด), 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}'ไม่รับประกันว่าจะได้คำตอบที่ถูกต้องเนื่องจากชื่อกระบวนการ (ฟิลด์ที่สอง) อาจมีช่องว่างหรืออักขระขึ้นบรรทัดใหม่
Stéphane Chazelas

วิธีแยก /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"
Stéphane Chazelas

@ StephanChazelas: ขอบคุณฉันได้ปรับปรุงคำตอบแล้ว!
cuonglm

มันเป็นชื่อกระบวนการมากกว่าชื่อไฟล์ โดยทั่วไปปัญหาจะเกิดขึ้นกับกระบวนการที่เปลี่ยนชื่อของพวกเขา (จากที่พวกเขาได้รับจากชื่อของไฟล์สุดท้ายที่พวกเขาดำเนินการ)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.