Setiap program yang berjalan adalah proses yang hidup dalam ekosistem sendiri. Episode ini membedah PID/PPID dan state proses, mempraktikkan pemantauan dengan ps, top, dan htop, mengendalikan proses lewat sinyal, serta menjalankan tugas background dengan nohup, screen, dan tmux.

Setelah di episode 12 sebelumnya kita membahas shell, environment variables, dan kustomisasi .bashrc — dari VAR=x vs export VAR, startup files, sampai script bash pertama — kalian sekarang bisa memberi instruksi kompleks ke sistem. Namun ada yang selama ini berjalan di balik layar setiap kali kalian mengetik perintah: proses. Setiap program, dari ls yang paling sederhana sampai Nginx yang melayani ribuan request, adalah proses yang hidup di kernel, memakan CPU dan RAM, dan bisa dilihat, dipantau, serta dikendalikan.
Pada episode kali ini, kita akan membuka "ruang mesin" Linux: apa itu PID dan PPID, apa arti state proses seperti R, S, dan Z (zombie), bagaimana membaca snapshot dengan ps, memantau real-time dengan top/htop, serta bagaimana menghentikan proses dengan sinyal yang tepat. Di akhir episode, kalian akan tahu persis apa yang terjadi saat sebuah server "hang" dan bagaimana menanganinya tanpa panik. Mari kita mulai.
Ketika kernel menjalankan sebuah program, ia membuat proses — sebuah entitas yang memiliki kode program, data, dan konteks eksekusi sendiri. Setiap proses diberi PID (Process ID), sebuah angka unik di dalam sistem. Proses yang menciptakannya disebut parent, dengan PPID (Parent Process ID). Inilah mengapa seluruh proses di Linux membentuk pohon: ada satu akar di nomor 1, dan setiap proses adalah cabang dari proses lain.
Bayangkan sebuah restoran yang sangat terorganisir. Koki kepala (PID 1, systemd atau init) mempekerjakan staf dapur. Setiap staf yang merekrut staf lain akan tercatat sebagai parent dari rekrutannya. Kalau sebuah staf berhenti tiba-tiba, staf rekrutannya menjadi "yatim" dan diadopsi oleh koki kepala. Analogi ini menjelaskan mengapa setiap proses yatim akhirnya di-reparent ke PID 1.
Setiap proses juga memiliki state yang mencerminkan apa yang sedang dilakukannya. Empat state yang paling sering kalian lihat:
| State | Arti | Kapan terjadi |
|---|---|---|
R (Running) | Proses aktif mengeksekusi kode | Sedang memakai CPU |
S (Sleeping) | Proses menunggu sesuatu (I/O, timer) | Menunggu disk, jaringan, atau event |
D (Uninterruptible sleep) | Menunggu I/O yang tak bisa diinterupsi | Menunggu disk bermasalah (sulit dibunuh) |
Z (Zombie) | Proses mati tapi belum "dikubur" parent | Parent belum memanggil wait() |
State Z adalah salah satu fenomena yang paling sering membuat admin pemula panik. Zombie adalah proses yang sudah selesai menjalankan tugasnya tapi entri-nya belum dibersihkan dari tabel proses, karena parent-nya belum memanggil wait(). Zombie tidak memakan CPU atau RAM — ia hanya sisa identitas. Mereka menumpuk hanya jika parent-nya buggy (tidak pernah memanggil wait) atau parent-nya ikut macet.
ps, pstreePerintah utama untuk mengambil snapshot proses adalah ps. Dua sintaks yang paling sering dipakai: ps aux (format BSD) dan ps -ef (format POSIX). Keduanya menampilkan daftar proses lengkap; perbedaannya hanya gaya format dan nama kolom.
ps auxOutput ps aux yang biasa kalian lihat (dipotong di sini):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 167520 11544 ? Ss Aug01 0:15 /sbin/init
arman 12345 2.5 3.1 620000 128000 ? Ssl Aug01 12:04 node server.js
nginx 23456 0.1 0.2 210000 20000 ? S Aug01 0:30 nginx: worker process
arman 34567 0.0 0.0 0 0 ? Z Aug01 0:00 [defunct]Beberapa kolom yang wajib kalian kenali:
kill.S sleeping, R running, Z zombie).Perhatikan baris keempat: STAT Z dan nama perintah [defunct] adalah tanda klasik proses zombie. Jika kalian melihatnya, tidak perlu panik — ia hanya menunggu parent-nya dipanggil wait(). Jika jumlahnya menumpuk, cek parent-nya, bukan membunuh zombie-nya.
Sedangkan pstree menyajikan proses dalam bentuk pohon keluarga, persis seperti silsilah restoran tadi:
pstreesystemd─┬─nginx───2*[nginx]
├─sshd───sshd───bash───node───4*[node]
└─systemd-journaltop dan htopps adalah foto; top adalah kamera video. top memperbarui tampilannya setiap beberapa detik, mengurutkan proses berdasarkan penggunaan CPU, dan menampilkan ringkasan sistem di bagian atas — load average, jumlah proses, penggunaan CPU per komponen, dan penggunaan memori. Jalankan dengan top lalu tekan q untuk keluar.
top
# Instal htop — tampilan interaktif dengan mouse & warna
sudo apt install htop
htophtop adalah pengganti top yang lebih ramah: warna-warni, bisa di-scroll, mendukung mouse, dan perintah pembunuh proses (F9) tanpa perlu mengingat PID. Untuk server produksi, top tetap menjadi standar karena selalu tersedia; htop adalah kenyamanan tambahan. Keduanya memantau hal yang sama: siapa yang paling banyak memakan resource saat ini.
Tip
Di top, tekan M untuk mengurutkan berdasarkan pemakaian memori dan P untuk kembali ke urutan CPU — cara cepat menemukan proses "bandel". Untuk melihat proses milik user tertentu, jalankan top -u arman. Kebiasaan membaca output top setiap kali server mulai lambat adalah skill yang akan sangat membayar di episode 24 (performance tuning).
Ini bagian yang paling penting. Linux tidak "membunuh" proses secara sembarangan — ia mengirim sinyal (signal), dan proses memutuskan bagaimana merespons. Sinyal adalah cara standar komunikasi antar proses; kalian mengirimnya lewat kill <PID>, killall, atau pkill. Beberapa sinyal yang wajib dihafal:
| Sinyal | Nomor | Perilaku default | Penggunaan |
|---|---|---|---|
SIGTERM | 15 | Proses diminta berhenti dengan sopan | Menghentikan proses secara normal |
SIGKILL | 9 | Dipaksa berhenti, tidak bisa ditolak | Proses macet total yang tak mau mati |
SIGHUP | 1 | Hang up — sering dipakai untuk reload config | nginx reload tanpa restart |
SIGINT | 2 | Interrupt — sama dengan Ctrl+C | Membatalkan proses foreground |
SIGSTOP | 19 | Proses di-pause (bisa dilanjutkan) | Mirip Ctrl+Z |
# Kirim SIGTERM (15) — permintaan berhenti yang sopan
kill 12345
# Kirim sinyal spesifik
kill -15 12345 # sama dengan kill 12345
kill -9 12345 # SIGKILL — paksa berhenti
kill -1 12345 # SIGHUP — minta reload konfigurasi
# Bunuh berdasarkan nama (bukan PID)
killall node
pkill -f "node server.js"Important
Jangan pernah langsung kill -9. Sinyal itu memotong proses secara kasar tanpa memberi kesempatan membersihkan diri — file yang sedang ditulis bisa korup, database bisa kehilangan data, dan state in-memory hilang. Urutan yang benar: kirim SIGTERM (15), tunggu beberapa detik, baru pertimbangkan SIGKILL (9) jika proses benar-benar membandel. Analoginya: SIGTERM adalah mengucapkan "tolong berhenti sekarang", SIGKILL adalah mematikan mesin langsung dari saklar utama.
pkill -f "pola" punya kekuatan sekaligus bahaya: ia membunuh semua proses yang baris perintahnya cocok dengan pola. Salah pola dan kalian bisa mematikan proses yang tidak disangka. Gunakan pgrep -f dulu untuk melihat apa yang akan cocok sebelum pkill.
Sejauh ini semua perintah kita berjalan di foreground — terminal terkunci sampai perintah selesai. Untuk proses yang berjalan lama (misalnya server dev), ada mekanisme background:
# Jalankan langsung di background dengan tanda &
sleep 300 &
# Daftar job yang ada di sesi shell ini
jobs -l
# Pindahkan job ke foreground
fg %1
# Pause proses foreground dengan Ctrl+Z, lalu lanjutkan di background
# (setelah menekan Ctrl+Z)
bg %1Peta lengkapnya: perintah & memulai job di background; Ctrl+Z menghentikan sementara job foreground; jobs mencantumkan job dengan nomor %n; fg %n mengembalikannya ke foreground; bg %n melanjutkan job yang di-pause ke background. Perhatikan perbedaan penting: job background bukan proses "lepas" — ia tetap terikat pada terminal sesi. Tutup terminal itu, dan job-nya ikut mati.
Note
Kenapa job background ikut mati saat terminal ditutup? Karena kernel mengirim SIGHUP (hang up) ke semua proses yang terikat terminal ketika terminal menutup. Untuk melepaskan proses dari terminal, kita butuh alat yang "mengadopsi" proses itu — inilah gunanya nohup, screen, dan tmux.
nohup, screen, dan tmuxUntuk pekerjaan yang harus bertahan setelah SSH terputus — migrasi database, build besar, atau server yang harus jalan 24/7 — ada tiga tingkat solusi:
nohup (no hang up) adalah yang paling sederhana: ia mengabaikan sinyal SIGHUP, sehingga proses bertahan setelah terminal ditutup. Outputnya dialihkan ke nohup.out.
nohup ./migrate-data.sh > migrasi.log 2>&1 &
# Proses terus berjalan; cek hasilnya nanti
tail -f migrasi.logscreen dan tmux adalah terminal multiplexer — mereka menciptakan sesi terminal yang hidup terpisah dari terminal fisik. Kalian bisa melepaskan (detach) sesi, menutup SSH, dan kembali lagi nanti; proses tetap berjalan dan output masih ada. tmux adalah standar modern yang paling populer:
# Buat sesi baru bernama "deploy"
tmux new -s deploy
# Di dalam sesi: Ctrl+B lalu D untuk detach
# (proses di dalamnya terus berjalan)
# Lihat semua sesi yang aktif
tmux ls
# Kembali ke sesi
tmux attach -t deployTip
Kapan memakai yang mana? nohup untuk satu perintah yang perlu bertahan. tmux saat kalian butuh workspace interaktif — menjalankan beberapa panel, meng-scroll output, dan kembali ke sesi yang sama setelah koneksi terputus. Untuk server produksi yang harus auto-restart saat crash, jangan pakai ketiganya — itu pekerjaan systemd, yang akan menjadi topik episode 14.
| Kesalahan | Gejala | Solusi |
|---|---|---|
kill -9 langsung tanpa SIGTERM | Data korup, proses tak sempat cleanup | Kirim SIGTERM dulu, tunggu, baru SIGKILL |
| Panik melihat proses zombie | Ingin kill zombie (tidak akan bekerja) | Cek parent; zombie dibersihkan oleh parent-nya |
pkill -f dengan pola terlalu luas | Proses yang tidak disangka ikut mati | pgrep -f dulu untuk melihat kecocokan |
Membunuh PID dari ps tanpa verifikasi | Proses salah terbunuh (PID reused) | Verifikasi nama & waktu mulai, atau pakai pgrep |
| Menutup terminal dengan job background | Job ikut mati (SIGHUP) | Pakai nohup, screen, atau tmux |
kill proses D state | Tidak mau mati meski -9 | Tunggu I/O selesai; -9 tidak mempan pada D |
Satu hal yang patut diingat: PID itu bisa dipakai ulang oleh sistem. Proses yang kalian lihat di ps sekarang bisa sudah mati dan PID-nya dipakai proses lain. Itulah alasan pkill/killall (berbasis nama) lebih aman untuk "bunuh semua" dan pgrep berguna untuk memverifikasi sebelum kill per-PID.
Pada episode 13 ini kita telah membuka ruang mesin Linux: memahami PID/PPID dan state proses termasuk zombie, membaca snapshot dengan ps aux dan hierarki dengan pstree, memantau real-time dengan top/htop, mengendalikan proses lewat sinyal SIGTERM/SIGKILL/SIGHUP, serta memindahkan pekerjaan ke background dengan &, jobs, fg, bg dan membuatnya persisten dengan nohup, screen, dan tmux. Pelajaran terpenting: proses adalah warga sistem yang punya hak dan tata cara — hormati mereka dengan sinyal yang tepat, dan sistem akan bekerja sama dengan kalian.
Namun, ada satu pertanyaan yang menggantung sejak tadi: siapa yang menjaga agar proses penting selalu berjalan — bahkan setelah crash atau reboot? Jawabannya adalah systemd, init system modern yang menjadi proses nomor 1 di hampir semua distro. Di episode 14 selanjutnya kita akan membahas systemd dan managing services: systemctl, journalctl, hingga menulis service unit file sendiri. Sampai jumpa!