Có thể lấy ID nhóm quy trình từ / Proc không?


16

Trong " /programming/13038143/how-to-get-pids-in-one- Process-group-in-linux-os " tôi thấy tất cả các câu trả lời đề cập psvà không đề cập đến /proc.

"ps" dường như không dễ di chuyển (phiên bản Android và Busybox mong đợi các đối số khác nhau) và tôi muốn có thể liệt kê các pids với pgids bằng các công cụ đơn giản và di động.

Trong /proc/.../status tôi thấy Tgid:(ID nhóm luồng), Gid:(id nhóm để bảo mật, không phải để nhóm các quy trình lại với nhau), nhưng không PGid:...

Những cách khác (không sử dụng ps) để nhận pgid từ pid là gì?

Câu trả lời:


24

Bạn có thể nhìn vào trường thứ 5 trong đầu ra của /proc/[pid]/stat.

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

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

Từ 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.

Lưu ý rằng bạn không thể sử dụng:

awk '{print $5}'

Bởi vì tập tin đó không phải là một danh sách trống. Trường thứ hai (tên quy trình có thể chứa khoảng trắng hoặc thậm chí các ký tự dòng mới). Ví dụ, hầu hết các chủ đề firefoxthường có ký tự khoảng trắng trong tên của chúng.

Vì vậy, bạn cần in trường thứ 3 sau lần xuất hiện cuối cùng của một )ký tự trong đó.


Lưu ý rằng awk '{print $5}'không được đảm bảo để cung cấp cho bạn câu trả lời đúng vì tên quy trình (trường thứ hai) có thể chứa ký tự khoảng trắng hoặc dòng mới.
Stéphane Chazelas

Làm thế nào để phân tích đáng tin cậy /proc/.../stat?
Vi.

3
@Vi, xem câu trả lời đó perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" hoặcp=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas

@StephaneChazelas: Cảm ơn, tôi đã cập nhật câu trả lời của mình!
cuonglm

Đó là tên quá trình nhiều hơn tên tệp. Vấn đề thường xảy ra với các quy trình thay đổi tên của họ (từ cái họ nhận được từ tên của tệp cuối cùng họ thực hiện).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.