PID dan PPID Linux: memeriksa proses serta hubungan induknya

PID (process ID atau ID proses) mengidentifikasi sebuah proses. PPID (parent process ID atau ID proses induk) menunjukkan PID induknya saat ini; induk tersebut dapat berubah ketika proses dipindahkan ke induk lain. Di Linux, nomor-nomor ini membantu Anda menemukan proses, memeriksa hubungan induk dan anak, serta mengirim sinyal kepada proses tertentu bila diperlukan. Kernel menetapkan nomornya; yang Anda kelola adalah proses yang saat ini diidentifikasi nomor tersebut.

Apa perbedaan PID dan PPID?

Proses adalah satu instans program yang sedang dijalankan. Menjalankan program yang sama dua kali biasanya menghasilkan dua proses dengan PID berbeda. Ketika sebuah proses membuat proses lain, proses baru itu juga mempunyai PPID yang menunjuk ke induknya.

Kolom Arti Kegunaan
PID Nomor identifikasi proses itu sendiri Memilih proses tertentu untuk diperiksa atau dikirimi sinyal
PPID PID induk proses saat ini Menelusuri hubungan induk dan anak; setelah pergantian induk, nilainya dapat berbeda dari PID pembuat awal

Misalnya, shell memiliki PID 4250 dan proses sleep yang dimulainya mempunyai PID 4321. Proses sleep tersebut dapat menampilkan 4250 sebagai PPID. Angka-angka ini hanya ilustrasi. PID bukan identitas permanen: setelah proses berakhir dan dibersihkan, nomornya dapat digunakan kembali. Dalam lingkungan yang memakai namespace PID, seperti kontainer, proses yang sama juga dapat terlihat dengan nomor PID berbeda menurut tempat pengamatannya. Namespace PID memisahkan ruang penomoran dan tampilan proses.

Bagaimana memeriksa PID dan PPID sebuah proses?

Cara langsungnya adalah meminta ps menampilkan kolom yang dibutuhkan. Contoh ini menggunakan Bash dan ps Linux dari procps-ng. Bash mengekspansi $$ menjadi PID shell, sehingga perintah berikut menampilkan informasi shell tersebut:

ps -p "$$" -o pid,ppid,user,stat,etime,args

Keluarannya bergantung pada lingkungan. PID adalah nomor shell itu sendiri, sedangkan PPID mengidentifikasi induknya. USER menunjukkan pengguna pemilik proses, STAT menunjukkan status proses, ELAPSED menunjukkan waktu yang telah berlalu sejak proses dimulai, dan COMMAND atau ARGS menunjukkan perintahnya.

    PID    PPID USER     STAT     ELAPSED COMMAND
   4250    4110 learner  Ss         00:42 -bash

Angka dan nama pengguna di atas merupakan contoh keluaran, bukan nilai yang harus muncul pada sistem Anda. Anda juga dapat memeriksa PID yang sudah diketahui dengan ps -p 4321 -o pid,ppid,args. Jika proses sudah berakhir dan PID itu belum dipakai proses lain, baris prosesnya tidak ditampilkan. Untuk melihat semua proses yang saat ini terlihat, gunakan ps -eo pid,ppid,user,stat,args. Hubungkan daftar panjang ke less jika perlu menelusurinya.

Untuk mencari PID berdasarkan nama proses, gunakan pola pgrep -a -x sleep. Opsi -x mengharuskan kecocokan nama proses secara tepat, dan -a menyertakan baris perintah. Beberapa proses dapat mempunyai nama sama, sehingga satu PID yang cocok belum membuktikan bahwa itulah pekerjaan Anda. Panduan perintah ps berbahasa Inggris dan panduan perintah pgrep berbahasa Inggris menjelaskan opsi-opsi tersebut lebih lanjut.

Memeriksa hubungan induk dan anak tanpa mengubah proses

Latihan dasar membuat proses dan mengirim sinyal dibahas dalam panduan pengelolaan proses dan pekerjaan berbahasa Inggris. Di sini, cukup periksa shell saat ini dan anak langsungnya tanpa menghentikan proses apa pun. Perintah ps yang melakukan pemeriksaan dapat muncul sebagai anak sementara, dan proses dapat selesai di antara dua kueri.

ps -p "$$" -o pid,ppid,user,lstart,args
ps --ppid "$$" -o pid,ppid,stat,args

Dalam Bash interaktif, $$ menunjukkan shell tersebut. Di dalam subshell Bash yang dibuat dengan kurung biasa, $$ dapat tetap bernilai PID Bash induk. Bedakan dengan $BASHPID ketika Anda membutuhkan PID proses Bash yang sedang berjalan di dalam subshell itu. Jika pstree terpasang, pstree -p "$$" dapat digunakan sebagai tampilan pohon opsional.

Membedakan namespace PID dan penggunaan kembali nomor

Proses yang sama dapat mempunyai PID berbeda ketika dilihat dari host dan kontainer. Perintah berikut membaca pengenal namespace PID shell saat ini serta hierarki PID yang terlihat melalui sistem berkas proc tersebut. Lingkungan dengan satu namespace mungkin hanya menampilkan satu nilai NSpid. Konfigurasi kernel, keterlihatan proc, dan izin dapat membatasi hasil atau membuat entri tidak tersedia.

readlink "/proc/$$/ns/pid"
grep '^NSpid:' "/proc/$$/status"

Pada jalur status proses utama di atas, NSpid menunjukkan ID dalam namespace yang bertingkat, dimulai dari sudut pandang namespace tempat proc dipasang. Karena itu, hasilnya perlu dibaca bersama lokasi pengamatan. Secara umum PPID juga dapat terlihat sebagai 0 jika induk berada di luar namespace PID pengamat.

Perbedaan namespace adalah perbedaan nomor menurut tempat pengamatan. Penggunaan kembali PID terjadi ketika proses yang datang kemudian menerima nomor yang sebelumnya dipakai proses yang sudah berakhir. Jangan menyamakan keduanya atau mencampurkan PID host dan kontainer saat mengirim sinyal.

Apa yang terjadi ketika induk berakhir atau PID berubah?

Menghentikan induk tidak selalu menghentikan semua anaknya. Anak yang masih hidup dapat mengalami pergantian induk atau reparenting, sehingga PPID berubah. Karena itu, jangan beranggapan mengirim sinyal kepada satu PID induk akan membersihkan semua proses di bawahnya.

Sebaliknya, anak yang sudah berakhir tetapi status keluarnya belum diambil oleh induk dapat tetap tercatat sebagai proses zombie. Anak itu tidak lagi berjalan, sehingga mengirim KILL berulang kali ke PID-nya bukan penyelesaian masalah. Periksa cara program induk mengambil status anaknya, yang disebut reaping. Perintah wait milik Bash dapat mengambil status keluar anak yang dibuat oleh shell tersebut.

PID mengidentifikasi proses pada waktu tertentu. Jangan memilih sasaran penghentian hanya dari berkas PID lama atau nomor yang pernah dicatat. Periksa perintah, pengguna pemilik, dan waktu mulai secara bersamaan. Saat bekerja di dalam maupun di luar kontainer, pastikan nomor dari namespace PID berbeda tidak tertukar.

Bagaimana mengelola proses layanan?

Layanan yang dikelola systemd dapat memperoleh PID berbeda setelah dimulai ulang. Dalam keadaan itu, periksa dan kelola unit layanan, yaitu satuan pengelolaan layanan oleh systemd, alih-alih langsung mengirim sinyal kepada satu PID. Misalnya, jika nginx.service benar-benar terpasang, systemctl status nginx.service memeriksa statusnya. Gunakan sudo systemctl restart nginx.service hanya jika mulai ulang memang diperlukan dalam operasi sistem. Jika nginx tidak terpasang atau sistem memakai pengelola layanan lain, pastikan nama layanan dan cara pengelolaannya terlebih dahulu. Manual resmi systemctl menjelaskan pemeriksaan status dan operasi restart.

PID membantu Anda memilih proses tertentu, sedangkan PPID membantu memahami hubungan induknya. Sebelum menghentikan pekerjaan, persempit sasaran yang tepat, bukan langsung mengirim sinyal kepada semua proses dengan nama yang cocok. Untuk layanan sistem yang dikelola, gunakan pengelola layanannya.

Dokumentasi namespace PID dan dokumentasi kolom status proc menjelaskan cakupan pengamatan serta kolom NSpid.

Sumber rujukan

Manual ps(1), pgrep(1), pstree(1), dan kill(1) menjelaskan pemeriksaan proses serta pengiriman sinyal. Dokumentasi parameter khusus Bash dan perintah bawaan pengendalian pekerjaan Bash menjelaskan $$, $!, dan wait. Lihat wait(2) untuk perilaku ketika induk berakhir serta keadaan zombie.