Proses di Linux: ps, top, htop, kill, sinyal, dan nice
Proses di Linux dilihat dengan ps aux (potret sesaat), top dan htop (daftar yang diperbarui dengan beban). Proses dihentikan dengan kill PID, yang secara default mengirim SIGTERM yang sopan; kill -9 (SIGKILL) hanya dipakai jika proses tidak merespons. Prioritas diatur dengan nice saat menjalankan dan renice untuk proses yang sudah berjalan, dalam rentang -20 sampai 19.
Setiap program yang berjalan di Linux adalah sebuah proses dengan nomor PID, pemilik, status, dan prioritasnya sendiri. Proses dapat dilihat dengan ps, top, dan htop, dihentikan dengan kill, dan prioritasnya diubah dengan nice serta renice. Di bawah ini kita bahas cara membaca keluaran perintah-perintah tersebut, sinyal apa yang dikirim dan kapan, serta mengapa kill -9 sebaiknya bukan refleks pertama.
Apa itu proses dan PID
Proses adalah program pada saat dijalankan: kode, memori, berkas yang terbuka, dan sekumpulan atribut. Kernel memberi setiap proses sebuah pengenal unik bernama PID, dan juga mencatat PPID — nomor induk yang menjalankannya. Proses pertama di sistem dengan PID 1 biasanya adalah systemd, dan ia menjadi «leluhur» bagi semua proses lainnya.
Proses baru lahir dalam dua langkah. Pertama, induk memanggil fork() dan mendapatkan salinan dirinya. Kemudian salinan itu memanggil execve() dan mengganti kodenya dengan kode program baru. Saat Anda mengetik ls di terminal, bash melakukan persis hal ini dan menunggu anak prosesnya selesai melalui wait().
$ echo $$ # PID shell saat ini
4182
$ ps -o pid,ppid,cmd -p $$
PID PPID CMD
4182 4170 -bash
Melihat proses dengan ps
ps membuat potret sesaat: ia menampilkan proses tepat pada saat dijalankan, lalu selesai. Tanpa argumen, ia hanya menampilkan proses dari terminal saat ini, sehingga dalam praktiknya hampir selalu dipakai salah satu dari dua varian berikut.
$ ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 168540 12780 ? Ss 09:12 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:12 0:00 [kthreadd]
www-data 1532 1.2 2.1 412308 86420 ? S 09:15 1:47 php-fpm: pool www
postgres 1610 0.4 3.8 221004 154312 ? Ss 09:15 0:31 postgres: checkpointer
Di sini a — proses dari semua pengguna, u — format rinci dengan pemilik, x — termasuk proses tanpa terminal (daemon). Sintaks gaya System V, ps -ef, menampilkan PPID, yang berguna jika Anda ingin tahu siapa yang menjalankan siapa.
| Kolom | Arti |
|---|---|
PID | pengenal proses |
%CPU, %MEM | porsi prosesor dan memori fisik |
VSZ | memori virtual dalam KB (termasuk yang tidak dimuat ke RAM) |
RSS | memori fisik yang benar-benar terpakai dalam KB |
STAT | status proses (R, S, D, Z, T) dan flag |
TIME | total waktu prosesor yang dipakai, bukan lama berjalan |
Trik berguna dengan ps
# 10 teratas berdasarkan memori
ps aux --sort=-%mem | head -11
# 10 teratas berdasarkan prosesor
ps aux --sort=-%cpu | head -11
# kolom sesuai keinginan
ps -eo pid,ppid,user,ni,stat,etime,cmd
# pohon proses
ps -ef --forest
pstree -p
# mencari PID berdasarkan nama
pgrep -a nginx
pidof nginx
Kesalahan klasik adalah mencari proses dengan ps aux | grep nginx lalu mendapati grep itu sendiri di keluaran. Gunakan pgrep atau trik grep [n]ginx, yang tidak cocok dengan baris perintahnya sendiri.
Status proses: R, S, D, Z, T
Huruf di kolom STAT bukan sekadar hiasan, melainkan status nyata proses. Dari situ bergantung cara membaca beban sistem dan apakah kill akan berguna.
| Kode | Status | Arti dalam praktik |
|---|---|---|
R | Running | sedang berjalan atau menunggu giliran di CPU |
S | Interruptible sleep | menunggu kejadian (jaringan, input, timer); status normal bagi sebagian besar proses |
D | Uninterruptible sleep | menunggu I/O di dalam kernel, sinyal tidak dapat dikirim |
Z | Zombie | sudah selesai, tetapi induknya belum mengambil kode keluarnya |
T | Stopped | dihentikan sementara oleh SIGSTOP atau Ctrl+Z |
Karakter tambahan setelah huruf juga berguna: s — pemimpin sesi, + — proses di latar depan terminal, < — prioritas tinggi, N — prioritas rendah, l — multithread.
Proses dalam status D
Proses dalam D berada di dalam system call dan menunggu, misalnya, respons dari disk atau NFS yang macet. Tidak ada sinyal yang bisa sampai kepadanya, termasuk SIGKILL. Karena itu kill -9 tidak berguna di sini: yang perlu dicari adalah penyebab penantiannya — lihat iostat, dmesg, dan kondisi penyimpanan jaringan.
Proses zombie
Zombie sudah mati: ia tidak memakai CPU maupun memori, hanya menyisakan satu baris di tabel proses. Zombie tidak bisa dibunuh karena memang sudah selesai. Ia akan hilang ketika induknya memanggil wait(), atau ketika induknya sendiri berakhir dan zombie tersebut diadopsi oleh PID 1.
# cari zombie dan induknya
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
Satu zombie tidak berbahaya. Jika jumlahnya ratusan dan terus bertambah, berarti ada kesalahan pada program induknya: perbaiki atau restart program tersebut.
top: proses dan beban secara real-time
top menampilkan daftar yang sama, tetapi memperbaruinya setiap beberapa detik dan menyertakan ringkasan sistem. Ini adalah perintah pertama yang dijalankan ketika «server terasa lambat».
top - 14:21:07 up 12 days, 3:02, 2 users, load average: 1.84, 1.20, 0.95
Tasks: 213 total, 2 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu(s): 23.1 us, 4.2 sy, 0.0 ni, 70.3 id, 1.9 wa, 0.0 hi, 0.5 si, 0.0 st
MiB Mem : 7821.4 total, 412.6 free, 3105.8 used, 4303.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4398.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1532 www-data 20 0 412308 86420 14212 R 38.2 1.1 1:47.31 php-fpm
1610 postgres 20 0 221004 154312 148900 S 6.0 1.9 0:31.08 postgres
Baris %Cpu(s) paling penting: us — kode pengguna, sy — kernel, id — menganggur, wa — menunggu disk. wa yang tinggi sementara prosesor longgar adalah tanda pasti bahwa hambatan ada di I/O.
Tombol pintas top
| Tombol | Aksi |
|---|---|
P / M | urutkan berdasarkan CPU / memori |
1 | tampilkan setiap core secara terpisah |
c | baris perintah lengkap |
u | filter berdasarkan pengguna |
k | kirim sinyal ke proses |
r | ubah nice proses |
H | tampilkan thread |
q | keluar |
Untuk skrip dan log tersedia mode batch: top -b -n 1 | head -20 menampilkan satu potret tanpa interaksi. Untuk memantau satu proses saja — top -p 1532.
Load average adalah antrean, bukan persentase
Tiga angka load average adalah rata-rata panjang antrean dalam 1, 5, dan 15 menit. Di Linux, ke dalam antrean ini masuk proses dengan status R dan D, sedangkan tidur biasa S tidak. LA harus dibandingkan dengan jumlah core (nproc): pada 4 core, nilai 4 berarti beban penuh, sedangkan 12 berarti antrean tiga kali lipat kapasitas.
Jika LA tinggi tetapi prosesor menganggur, cari proses dalam D: ps -eo stat,pid,cmd | grep '^D'. Hampir selalu penyebabnya adalah disk yang lambat atau penyimpanan jaringan.
htop: pengganti top yang lebih nyaman
htop menampilkan hal yang sama, tetapi dengan indikator berwarna per core, scroll, dukungan mouse, dan pohon proses. Biasanya perlu dipasang: sudo apt install htop atau sudo dnf install htop.
F3atau/— mencari proses berdasarkan nama;F4— filter yang hanya menampilkan yang cocok;F5ataut— pohon «induk — anak»;F6— memilih kolom pengurutan;F7/F8— menurunkan atau menaikkan nice;F9— menu sinyal untuk proses yang dipilih;Space— menandai beberapa proses untuk aksi massal.
Pada server yang tidak memungkinkan instalasi apa pun, top sudah cukup: semua operasi utama juga tersedia di sana.
Cara menghentikan proses: kill dan sinyal
Perintah kill sebenarnya tidak «membunuh», melainkan mengirim sinyal ke proses. Apa yang terjadi berikutnya bergantung pada sinyalnya dan pada cara program menanganinya.
| Sinyal | Nomor | Fungsi |
|---|---|---|
SIGHUP | 1 | terminal terputus; banyak daemon membaca ulang konfigurasinya |
SIGINT | 2 | interupsi, sama dengan Ctrl+C |
SIGKILL | 9 | penghentian paksa oleh kernel, tidak bisa ditangkap |
SIGTERM | 15 | permintaan untuk berhenti dengan rapi; default pada kill |
SIGSTOP | 19 | jeda, tidak bisa ditangkap |
SIGCONT | 18 | melanjutkan proses yang dijeda |
SIGTSTP | 20 | jeda dari terminal, Ctrl+Z |
Nomor berlaku untuk x86 dan ARM; daftar lengkapnya ditampilkan oleh kill -l. Menulis sinyal dengan nama lebih andal daripada dengan nomor.
kill 1532 # SIGTERM
kill -TERM 1532 # sama, ditulis eksplisit
kill -HUP $(pidof nginx) # membaca ulang konfigurasi
kill -STOP 1532; kill -CONT 1532
kill -0 1532 && echo "proses masih hidup"
Sinyal 0 tidak mengirim apa pun, hanya memeriksa apakah proses ada dan apakah Anda berhak mengirim sinyal kepadanya — berguna dalam skrip.
Mengapa jangan mulai dari kill -9
SIGTERM memberi program kesempatan untuk menutup berkas, mengosongkan buffer, menghapus lock-file, dan menyelesaikan transaksi dengan benar. SIGKILL memutus semuanya seketika: data yang belum ditulis hilang, berkas sementara tertinggal, dan basis data bisa masuk ke pemulihan saat dinyalakan lagi.
Urutan yang benar:
- Kirim
kill PID(SIGTERM). - Tunggu 5–30 detik sambil memeriksa dengan
kill -0 PID. - Hanya jika proses masih hidup dan tidak dalam status
D—kill -9 PID.
Untuk layanan di bawah systemd, sebaiknya PID tidak disentuh secara manual: systemctl stop sendiri akan mengirim SIGTERM, menunggu batas waktu, lalu menuntaskan dengan SIGKILL.
pkill dan killall: berdasarkan nama
pkill -f "python worker.py" # berdasarkan seluruh baris perintah
pkill -u alice # semua proses milik pengguna
killall -TERM node # semua proses bernama node
pgrep -l -f worker # periksa dulu apa yang akan terkena pola
Sebelum pkill massal, selalu jalankan pgrep dengan pola yang sama: -f cocok dengan bagian mana pun dari baris perintah dan mudah mengenai proses yang tidak diinginkan.
Sinyal hanya bisa dikirim ke proses milik sendiri; proses orang lain memerlukan sudo. Error Operation not permitted berarti persis itu.
Prioritas proses: nice dan renice
Nilai nice memberi tahu penjadwal siapa yang harus mengalah dalam memakai prosesor. Rentangnya dari -20 (prioritas tertinggi) hingga 19 (mengalah kepada semua), defaultnya 0. Di top nilai ini terlihat di kolom NI, sedangkan PR adalah prioritas internal turunan.
# jalankan tugas berat dengan prioritas rendah
nice -n 10 tar czf backup.tar.gz /var/www
# menurunkan prioritas proses yang sedang berjalan
renice -n 15 -p 1532
# menaikkan (hanya root)
sudo renice -n -5 -p 1610
# semua proses milik pengguna
sudo renice -n 10 -u alice
Pengguna biasa hanya bisa menurunkan prioritas proses miliknya sendiri; nilai negatif hanya tersedia untuk root. Perlu dipahami batas nice: ia hanya memengaruhi CPU. Jika tugas memperlambat sistem melalui disk, gunakan ionice -c3 perintah — kelas idle, yang mendapat disk hanya ketika tidak ada pihak lain yang membutuhkannya.
Proses latar belakang dan job shell
Perintah bisa dijalankan di latar belakang dengan menambahkan &, atau dijeda dengan Ctrl+Z. Shell menyimpan daftar job yang dikelola dengan perintah bawaan.
$ long_task &
[1] 5120
$ jobs
[1]+ Running long_task &
$ fg %1 # kembalikan ke latar depan
^Z # jeda (SIGTSTP)
$ bg %1 # lanjutkan di latar belakang
Saat terminal ditutup, shell mengirim SIGHUP ke job-job-nya, sehingga mereka ikut berhenti. Agar proses tetap hidup setelah keluar, jalankan dengan nohup perintah &, lepaskan dari shell dengan disown, atau gunakan tmux. Untuk pekerjaan yang terus berjalan, cara yang tepat adalah menjadikannya layanan systemd.
Skenario diagnosis yang umum
Siapa yang memakan prosesor
top -o %CPU # atau tekan P di dalam top
ps -eo pid,user,%cpu,etime,cmd --sort=-%cpu | head
Jika sebuah proses memakan CPU tanpa manfaat, turunkan prioritasnya dengan renice terlebih dahulu — ini aman dan memberi waktu untuk menyelidikinya.
Siapa yang menempati port
sudo ss -ltnp | grep :8080
sudo lsof -i :8080
Keluaran akan menampilkan PID. Dari PID itu Anda bisa menelusuri di /proc/PID/ untuk menemukan berkas yang dijalankan (exe), direktori kerja (cwd), dan argumennya (cmdline).
Proses tiba-tiba menghilang
Penyebab yang sering terjadi adalah OOM Killer, yang mematikan proses ketika memori habis. Pemeriksaannya: dmesg -T | grep -i oom atau journalctl -k | grep -i "killed process".
Kesimpulan
Untuk bekerja dengan proses di Linux, sekumpulan kecil perintah sudah cukup: ps aux untuk potret, top dan htop untuk pengamatan, kill dengan sinyal yang tepat untuk menghentikan, serta nice/renice untuk prioritas. Baca status proses sebelum bertindak: zombie dan proses dalam D tidak bisa diselesaikan dengan sinyal. Mulailah dari SIGTERM dan simpan kill -9 untuk kondisi terpaksa. Proses, memori, load average, dan system call dibahas secara praktis dalam kursus Linux.
Pertanyaan umum
Apa perbedaan ps aux dan ps -ef?
Keduanya adalah dua sintaks dari perintah yang sama: aux bergaya BSD dengan kolom %CPU, %MEM, dan STAT, sedangkan -ef bergaya System V dengan kolom PPID. Kumpulan prosesnya sama, yaitu semua proses dalam sistem.
Bagaimana cara mengetahui berapa banyak proses yang berjalan di sistem?
Cara termudah adalah melihat baris Tasks di top, atau menjalankan ps -e --no-headers | wc -l. Jumlah thread ditampilkan oleh ps -eLf --no-headers | wc -l.
Mengapa proses tidak berhenti walaupun sudah kill -9?
Kemungkinannya, proses itu berada dalam status D dan menunggu I/O di kernel, atau ia adalah zombie yang sebenarnya sudah selesai. Pada kasus pertama, cari masalah pada disk atau penyimpanan jaringan; pada kasus kedua, perbaiki atau restart induknya.
Apa yang terjadi jika proses dengan PID 1 dihentikan?
Kernel melindungi init: sinyal biasa, termasuk SIGKILL dari pengguna, tidak diteruskan kepadanya jika ia tidak menanganinya. Jika init tetap berhenti, sistem akan mengalami kernel panic.
Bagaimana cara membatasi penggunaan memori suatu proses?
Untuk layanan systemd, atur MemoryMax= di unit-file; untuk satu kali jalan, gunakan systemd-run --scope -p MemoryMax=500M perintah. Cara ini bekerja lewat cgroups dan lebih andal daripada ulimit -v yang lama.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
Ke kursus