Bagaimana cara saya mendapatkan ID proses induk dari proses anak yang diberikan?

50

Bagaimana cara mendapatkan orang tua pid dari pid anak yang diberikan?

Saya tahu saya dapat memeriksa secara manual di bawah / proc, saya bertanya-tanya apakah ada cara pintar / lebih baik untuk mencapai ini di Ubuntu. Perhatikan bahwa orang tua mungkin atau mungkin tidak terbunuh.

Terima kasih

cache
sumber

Jawaban:

58

Cara mendapatkan PID orang tua (PPID) dari ID proses anak (PID) menggunakan baris perintah

Menggunakan ps -o ppid=

  • misalnya ps -o ppid= 2072pengembalian 2061, yang dapat Anda gunakan dengan mudah dalam skrip dll. ps -o ppid= -C foomemberikan PPID proses dengan perintah foo. Anda juga dapat menggunakan tua kuno ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Penjelasan lebih lengkap: ps -f 2072pengembalian
    UID PID   PPID   C STIME TTY STAT TIME CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulsa / gconf-helper
    
  • The pstreerelasi adalah: pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-helper (2072)
    
ish
sumber
Apakah Anda tahu cara membuat doa show pstree (perintah + argumen) tanpa garis pemisah? Instalasi saya secara otomatis membagi baris jika saya menambahkan argumen, bahkan jika hasilnya dapat dengan mudah masuk pada satu baris. Halaman manual tampaknya mengatakan banyak, tetapi tidak memberikan alasan. Solusi saya melibatkan mengekstraksi PID dari pstree dan menggunakan ps -o args ...hasilnya, tetapi itu sedikit berbau.
John P
Hanya sesuatu yang mengejutkan saya: Ruang setelah ppid= tetapi sebelum pid tampaknya perlu. Saya mendapat hasil yang berbeda jika dihilangkan.
Gregory Arenius
8

Hanya menggunakan variabel untuk mendapatkan PID induk:

echo $PPID

jika Anda memerlukan perintah dari pid orangtua ini:

cat /proc/$PPID/comm

jika Anda memerlukan baris perintah lengkap (dengan semua opsi):

cat /proc/$PPID/cmdline

Penjelasan

  • $PPID didefinisikan oleh shell, itu adalah PID dari proses induk
  • di /proc/, Anda memiliki beberapa dir dengan PID dari setiap proses. Kemudian, jika Anda cat /proc/$PPID/comm, Anda mengulangi nama perintah PID

Periksa man proc

Gilles Quenot
sumber
1
Ini jawaban terbaik. procfs adalah API kernel. jalankan perintah dan parsing output adalah omong kosong
Massimo
Ini juga berpotensi yang paling portabel, PPIDdidefinisikan sebagai bagian dari standar POSIX sehingga setiap shell yang mematuhi POSIX harus mengatur ini dengan tepat. Lihat pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Menggunakan pstreedengan nama perintah

Menggunakan pstreeAnda dapat mencari berdasarkan nama proses anak dan mendapatkan ID Proses (PID) bersama dengan orang tua, kakek-nenek dan anak-anak dari proses anak:

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

Dalam hal ini sleepadalah perintah child dan itu PID 8414. ID induknya adalah 841 dan dipanggil display-auto-brightness. Kakek adalah shell ( sh) dengan ID proses 839. Kakek buyutnya cronmemiliki ID proses 795. Kakek buyut juga crondengan ID proses 763.

Jika Anda ingin mencari berdasarkan ID Proses sleepalih-alih nama, Anda dapat menggunakan:

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

Perhatikan sleepID proses diubah menjadi 14653. Induk (PID 841) tidur selama 1 menit, bangun untuk sepersekian detik dan kemudian memulai sleepperintah baru yang mendapat ID proses baru. Ini adalah alasan lain mengapa pencarian sleeplebih mudah daripada mencari dengan ID proses.

Kode ini diambil dari: Secara otomatis menyesuaikan kecerahan tampilan berdasarkan matahari terbit dan terbenam dan disesuaikan dengan pertanyaan ini.


Untuk melihat rantai bersarang sepanjang jalan kembali ke proses boot menggunakan PID alih-alih nama:

$ 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

Catatan: Satu menit lagi telah berlalu dan perintah sleep mendapat PID baru (8541).

WinEunuuchs2Unix
sumber
Dalam contoh Anda, metode ini tidak akan bekerja untuk proses cron dengan PID 807.
Olorin
@Olorin Dalam kedua contoh, Anda dapat menggunakan 807atau crondan jalur yang sama akan diperbaiki kembali serta lebih banyak anak jika melahirkan. Tetapi pertanyaannya adalah tentang menemukan orang tua, tidak semua anak.
WinEunuuchs2Unix
Tepat - bagaimana Anda menemukan induk PID 807 dengan output itu? Anda tidak bisa, karena itu tidak termasuk induk dari 807.
Olorin
@Olorin Induk cron adalah systemd yang merupakan PID 1. Saya tidak berpikir Anda dapat membunuh PID 1.
WinEunuuchs2Unix
Saya tidak mengatakan apa-apa tentang membunuh apa pun. Hanya untuk memperjelas, sekarang Anda mengklaim bahwa mengambil baris pertama pstree atau grepping untuk nama perintah akan selalu memberikan PID induk?
Olorin
0

ps -efj bisa juga digunakan untuk hal yang sama.

Sebagai contoh,

> 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]
Obi Wan - PallavJha
sumber