Buat daftar ID proses anak

Oct 02 2020

Saya ingin mendapatkan daftar semua ID proses anak untuk ID proses induk tertentu ( 6330 qemu) untuk digunakan dalam bashskrip.

Saya bisa melihatnya di htop, misalnya:

Hasil pencarian teratas meliputi:

# pgrep -P 6330
(no output)

# ps --ppid 6330
  PID TTY          TIME CMD

# pstree -p 6330
qemu(6330)-+-{qemu}(6332)
           |-{qemu}(6333)
           |-{qemu}(6340)
           |-{qemu}(6342)
           |-{qemu}(6343)
           `-{qemu}(6344)

... output ini sama jika dijalankan sebagai rootatau sebagai pengguna yang memilikinya qemu.

The pstreeoutput yang bisa diterapkan sebagai upaya terakhir, tapi aku lebih suka tidak parsing jika saya dapat membantu.

Juga ... ps aux | grep 6332dan pgrep 6332tidak menghasilkan apa-apa ... jadi itu juga sedikit membingungkan.

Ini seharusnya mudah bukan?

Saya menghargai waktu Anda.

Jawaban

2 KamilMaciorowski Oct 02 2020 at 10:35

Saya ingin mendapatkan daftar semua ID proses anak untuk ID proses induk tertentu ( 6330 qemu) untuk digunakan dalam bashskrip.

Solusi untuk masalah ini sebenarnya adalah pgrep -P 6330, tetapi pertanyaan lainnya menyarankan mungkin "ID proses anak" bukanlah yang Anda inginkan.

Anda menggunakan pgrep -P 6330dan hasilnya kosong karena tidak ada proses turunan. Apa htopdan pstreemenunjukkan bahwa Anda adalah utas . Jadi mungkin Anda benar-benar menginginkan ID utas.

Lihat ini:

  • Mengapa ada banyak proses yang terdaftar dengan judul yang sama di htop?

    htopmenunjukkan utas individu sebagai proses terpisah secara default, mirip dengan bagaimana ps -AL. Jika Anda menekan kapital Hitu akan beralih ke hanya menampilkan proses utama (menekannya lagi akan beralih kembali).

  • man 1 pstree:

    Untaian anak dari suatu proses ditemukan di bawah proses induk dan ditampilkan dengan nama proses dalam tanda kurung kurawal […]

  • Apakah utas diimplementasikan sebagai proses di Linux?

    Linux digunakan untuk menetapkan PID yang berbeda ke utas. Sejak Linux 2.4 threads dari suatu proses berbagi PID-nya; ini untuk memenuhi POSIX. Terminologi menjadi lebih rumit, "PID" agak ambigu. Dari jawaban yang relevan di SO :

    Hal pertama dan terpenting untuk disadari adalah bahwa "PID" memiliki arti yang berbeda dalam ruang kernel dan ruang pengguna. Apa yang disebut kernel sebagai PID sebenarnya adalah id utas tingkat kernel (sering disebut TIDs), […]. Setiap utas pada sistem, baik dalam proses yang sama atau berbeda, memiliki TID unik (atau "PID" dalam terminologi kernel).

    Apa yang dianggap sebagai PID dalam pengertian POSIX dari "proses", di sisi lain, disebut "ID grup utas" atau "TGID" di kernel. Setiap proses terdiri dari satu atau lebih utas (proses kernel) masing-masing dengan TID (kernel PID) mereka sendiri, tetapi semua berbagi TGID yang sama, yang sama dengan TID (kernel PID) dari utas awal tempat main berjalan.

    Saat topmenampilkan utas, ini menampilkan TIDs (PID kernel), bukan PID (TGID kernel), dan inilah mengapa setiap utas memiliki utas terpisah.

    Kalimat terakhir berlaku untuk htopatau pstreejuga.

Jika Anda masih ingin mendapatkan ID ini berbeda ( 6332, 6333, ...) untuk digunakan dalam skrip shell, memanggil ini:

ps -o lwp= -Lp 6330

Perintah ini tidak portabel, mungkin atau mungkin tidak berfungsi di OS Anda. Jika berhasil, Anda mungkin ingin mengecualikan utas utama:

ps -o lwp= -Lp 6330 | grep -v '^ *6330$'

( <space>*karena ps(setidaknya saya ps) menambahkan spasi di depan).