Làm cách nào để có được ID quy trình cha của quy trình con đã cho?


49

Làm thế nào để có được pid cha mẹ từ một pid con nhất định?

Tôi biết tôi có thể kiểm tra nó một cách cẩn thận dưới / Proc, tôi tự hỏi liệu có cách nào thông minh / tốt hơn để đạt được điều này trong Ubuntu không. Lưu ý cha mẹ có thể hoặc không thể bị giết.

Cảm ơn

Câu trả lời:


58

Làm cách nào để có được một bộ cha mẹ (PPID) từ ID tiến trình con (PID) bằng cách sử dụng dòng lệnh

Sử dụng ps -o ppid=

  • ví dụ ps -o ppid= 2072trả về 2061, mà bạn có thể dễ dàng sử dụng trong tập lệnh, v.v. ps -o ppid= -C foođưa ra PPID của quy trình với lệnh foo. Bạn cũng có thể sử dụng kiểu cũ ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Giải thích đầy đủ hơn: ps -f 2072trả về
    UID PID   PPID   C STIME TTY STAT TIME
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / xung / gconf-helper
    
  • Các pstreemối quan hệ là: pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-helper (2072)
    

Bạn có biết một cách để làm cho pstree hiển thị các lệnh (lệnh + đối số) mà không cần tách dòng không? Cài đặt của tôi sẽ tự động chia dòng nếu tôi thêm đối số, ngay cả khi kết quả có thể dễ dàng khớp trên một dòng. Trang người đàn ông dường như nói rất nhiều, nhưng không đưa ra lý do. Cách giải quyết của tôi liên quan đến việc trích xuất PID từ pstree và sử dụng ps -o args ...kết quả, nhưng điều đó có một chút mùi.
John P

Chỉ có một điều làm tôi ngạc nhiên: Không gian sau ppid= nhưng trước khi pid dường như là cần thiết. Tôi đã nhận được kết quả khác nhau nếu tôi bỏ qua nó.
Gregory Arenius

8

Chỉ sử dụng biến để có được cha mẹ PID:

echo $PPID

nếu bạn cần lệnh từ pid cha này:

cat /proc/$PPID/comm

nếu bạn cần dòng lệnh đầy đủ (với tất cả các tùy chọn):

cat /proc/$PPID/cmdline

Giải trình

  • $PPID được xác định bởi shell, nó là PID của tiến trình cha
  • trong /proc/, bạn có một số thư mục với PID của từng quy trình. Sau đó, nếu bạn cat /proc/$PPID/comm, bạn lặp lại tên lệnh của PID

Kiểm tra người đàn ông


1
Đây là câu trả lời tốt nhất. Procfs là một API kernel. thực hiện một lệnh và phân tích đầu ra là vô nghĩa.
Massimo

Đây cũng có khả năng di động nhất, PPIDđược xác định là một phần của tiêu chuẩn POSIX, do đó, mọi vỏ tuân thủ POSIX phải được đặt phù hợp. Xem pubs.opengroup.org/onlinepub/9699919799/utilities/ory
RobV

2

Sử dụng pstreetheo tên lệnh

Sử dụng, pstreebạn có thể tìm kiếm theo tên quy trình con và nhận ID quy trình (PID) cùng với cha mẹ, ông bà và bất kỳ đứa trẻ nào của quy trình con:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

Trong trường hợp sleepnày là lệnh con và nó là PID 8414. ID cha của nó là 841 và được gọi display-auto-brightness. Ông bà là một shell ( sh) với ID tiến trình là 839. Ông cố là cronvới một ID quá trình 795. Ông cố cũng croncó ID quy trình 763.

Nếu bạn muốn tìm kiếm theo ID tiến trình sleepthay vì tên, bạn có thể sử dụng:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

Lưu ý sleepID quá trình thay đổi thành 14653. Cha mẹ (PID 841) ngủ trong 1 phút, thức dậy trong một giây và sau đó bắt đầu một sleeplệnh mới nhận ID tiến trình mới. Đây là một lý do khác tại sao việc tìm kiếm sleepdễ dàng hơn tìm kiếm theo ID tiến trình.

Mã này được lấy từ: Tự động điều chỉnh độ sáng màn hình dựa trên mặt trời mọc và mặt trời lặn và thích nghi với câu hỏi này.


Để xem một chuỗi lồng nhau trong suốt quá trình khởi động lại, hãy sử dụng PID thay vì tên:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Lưu ý: Một phút nữa đã trôi qua và lệnh ngủ nhận được một PID mới (8541).


Trong ví dụ của bạn, phương pháp này sẽ không hoạt động cho quy trình định kỳ với PID 807.
Olorin

@Olorin Trong cả hai ví dụ, bạn có thể grep trên 807hoặc croncùng một dòng sẽ được truy xuất cũng như nhiều trẻ em hơn nếu sinh ra. Nhưng câu hỏi là về việc tìm cha mẹ, không phải tất cả trẻ em.
WinEunuuchs2Unix

Chính xác - làm thế nào để bạn tìm thấy cha mẹ của PID 807 với đầu ra đó? Bạn không thể, vì nó không bao gồm cha mẹ của 807.
Olorin

@Olorin Cha mẹ của cron là systemd là PID 1. Tôi không nghĩ bạn có thể giết chết PID 1.
WinEunuuchs2Unix

Tôi đã không nói bất cứ điều gì về việc giết bất cứ điều gì. Chỉ cần làm rõ, bây giờ bạn đang tuyên bố rằng việc lấy dòng đầu tiên của pstree hoặc grepping cho tên lệnh sẽ luôn cung cấp cho cha mẹ PID?
Olorin

0

ps -efj cũng có thể được sử dụng cho cùng.

Ví dụ,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
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.