Inspeksi proses

Inspeksi proses dengan ps, top, dan pgrep beserta disiplin pengiriman sinyal melalui kill.

Daftar isi

Program apa pun yang sedang berjalan di sistem berperan sebagai proses, lengkap dengan nomor identitas yang disebut PID (process identifier). Topik ini membahas cara memeriksa proses dari sisi terminal menggunakan ps, top, dan pgrep, lalu cara mengirimkan sinyal ke proses tertentu melalui kill secara terkendali. Penguasaan ketiga alat inspeksi tersebut membuat keputusan pengiriman sinyal tidak lagi ditebak, karena penyebab dan akibatnya terlihat jelas.

PID dan identitas proses#

Shell itu sendiri adalah sebuah proses, sehingga memiliki PID yang dapat dilihat melalui parameter khusus $$. Perintah ps menampilkan potret proses pada saat ia dipanggil. Dengan opsi -p, ps dipakai memeriksa satu PID tertentu, sedangkan opsi -o comm= memilih kolom nama program sekaligus menghapus baris judulnya. Kombinasi ini menjadi cara paling ringkas untuk membuktikan identitas sebuah proses.

bash
ps -o comm= -p $$
text Keluaran
bash

Keluarannya berisi satu kata, yaitu bash, karena proses yang menjalankan blok tersebut memang shell bash. Nilai $$ inilah yang biasa dipakai skrip untuk merujuk dirinya sendiri, misalnya ketika membuat nama berkas sementara yang unik. Setiap proses baru yang diluncurkan menerima nomor yang belum dipakai, sehingga PID selalu unik pada satu titik waktu. Identitas yang sama juga dipakai sistem operasi untuk mencatat pemilik, pemakaian memori, dan waktu proses.

Melihat proses dengan ps#

Tanpa argumen, ps hanya menampilkan proses yang berjalan pada sesi terminal yang sama. Opsi -C NAMA mempersempit daftar ke program dengan nama yang ditentukan, dan kombinasi dengan -o comm= menghasilkan keluaran yang stabil untuk dibandingkan. Blok berikut meluncurkan sleep 30 di background, lalu mencarinya berdasarkan nama programnya.

bash
sleep 30 &
sleep 0.2
ps -C sleep -o comm=
kill %1
wait
text Keluaran
sleep

Satu baris sleep muncul karena saat itu memang hanya ada satu proses sleep milik sesi. Jeda sleep 0.2 sebelum ps memberi waktu bagi shell untuk menyelesaikan peluncuran prosesnya, sehingga pencarian tidak berlangsung sebelum proses selesai dibuat. Untuk melihat seluruh proses sistem, ps menyediakan bentuk ps aux dan ps -e, yang keluarannya panjang dan bergantung pada isi mesin sehingga tidak didemokan di sini.

Memantau secara berkala dengan top#

Berbeda dari ps yang mencetak potret sekali lalu berhenti, top berjalan terus sebagai layar penuh dan memperbarui isinya setiap beberapa detik. Bagian atas layar menampilkan ringkasan sistem seperti waktu aktif, jumlah tugas, dan persentase pemakaian CPU, sedangkan tubuh tabelnya mendaftar proses satu baris per proses. Kolom yang paling sering dibaca adalah PID, pemilik proses, %CPU, %MEM, dan nama perintahnya. Menekan tombol q mengakhiri top.

Karena bersifat interaktif, top tidak menghasilkan keluaran yang cocok untuk blok Keluaran, sehingga blok berikut hanya menandai pemanggilannya. Dalam skrip, top dapat dijalankan dengan opsi -bn1 agar mencetak satu kali lalu berhenti, meskipun isinya tetap bergantung pada kondisi mesin saat itu.

bash
# tidak-dijalankan
# top berjalan sebagai layar penuh yang terus diperbarui, sehingga keluarannya tidak stabil untuk blok Keluaran
top

Mencari proses dengan pgrep#

Perintah pgrep menjawab pertanyaan yang lebih spesifik, yaitu PID apa saja yang cocok dengan sebuah pola nama. Opsi -c mengganti daftar PID dengan hitungannya, sedangkan opsi -f memperluas pencarian ke seluruh baris perintah, bukan hanya nama programnya. Kombinasi -c dan -f menjadi cara cepat untuk menghitung proses yang sedang menjalankan perintah tertentu.

bash
sleep 30 &
sleep 0.2
pgrep -c -f "sleep 30"
kill %1
wait
text Keluaran
1

Hitungan 1 muncul karena pola sleep 30 hanya mengenai proses sleep yang baru diluncurkan. Pencocokan dengan -f memeriksa baris perintah lengkap, sehingga pola yang terlalu pendek dapat mengenai proses lain yang tidak disangka. Pola sebaiknya ditulis selengkap mungkin, misalnya sleep 30 daripada hanya sleep.

Mengirim sinyal dengan kill#

Sesuai keterangan pada halaman manualnya, kill mengirim sinyal ke proses yang ditunjuk, dan mematikan hanyalah salah satu akibat yang mungkin. Tanpa opsi tambahan, kill mengirim SIGTERM, yaitu sinyal nomor 15 yang meminta proses menghentikan diri dengan tertib. Proses yang diberi kesempatan ini dapat menutup berkas log, menyelesaikan penulisan terakhir, lalu berhenti. Sinyal yang lain dikirim dengan opsi, misalnya kill -9 untuk SIGKILL yang tidak dapat ditangkap dan tidak dapat ditolak sama sekali.

Proses yang berhenti karena sinyal melaporkan kode keluar 128 ditambah nomor sinyalnya. Blok berikut mematikan job background dengan SIGTERM, lalu membaca kode keluarnya melalui wait.

bash
sleep 30 &
kill %1
wait $!
echo "kode keluar setelah SIGTERM: $?"
text Keluaran
kode keluar setelah SIGTERM: 143

Nilai 143 terdiri atas 128 ditambah 15, yaitu nomor sinyal SIGTERM. Perhitungan yang sama berlaku untuk SIGKILL bernomor 9, yang menghasilkan kode keluar 137. Pada proses yang dituntaskan SIGKILL, shell mencetak baris notifikasi Killed yang memuat PID, sehingga demo SIGKILL tidak ditampilkan dan cukup dihitung dari pola tersebut.

Kesalahan umum#

Kesalahan pada inspeksi dan pengiriman sinyal biasanya berupa keputusan yang diambil terlalu cepat. Daftar berikut memuat kekeliruan yang paling sering ditemui beserta perbaikannya.

  • Menjadikan kill -9 kebiasaan pertama. Proses tidak diberi kesempatan menutup berkasnya, sehingga log terpotong atau cadangan setengah jadi. Kirim SIGTERM lebih dahulu, tunggu sebentar, lalu gunakan SIGKILL sebagai upaya terakhir.
  • Menganggap kill pasti berhasil. SIGTERM boleh ditolak atau diabaikan oleh proses, sehingga prosesnya bisa tetap hidup. Periksa kembali dengan pgrep -c setelah mengirim sinyal.
  • Menulis pola -f yang terlalu pendek pada pgrep. Pola sleep mengenai sleep 5 dan sleep 30 sekaligus, sehingga hitungannya menyesatkan. Tulis pola selengkap baris perintah yang dimaksud.
  • Membaca ps tanpa memahami kolomnya. Tanda = pada -o comm= menghapus judul kolom, sehingga keluaran satu kolom perlu ditafsirkan sebagai nama program.

Ringkasan#

  • $$ menyimpan PID shell saat ini, dan ps -o comm= -p PID menampilkan nama program dari sebuah PID.
  • ps -C NAMA menyaring proses berdasarkan nama program, sedangkan pgrep -c -f POLA menghitung kecocokan pada baris perintah.
  • top memantau proses secara berkelanjutan dalam layar penuh dan diakhiri dengan tombol q.
  • kill mengirim sinyal dengan SIGTERM sebagai pilihan bawaan, dan proses yang mati karena sinyal N melaporkan kode keluar 128+N.

Referensi#