Panduan

Proses di Linux: ps, top, htop, kill, sinyal, dan nice

Diperbarui: · Skillaria.Top

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.

KolomArti
PIDpengenal proses
%CPU, %MEMporsi prosesor dan memori fisik
VSZmemori virtual dalam KB (termasuk yang tidak dimuat ke RAM)
RSSmemori fisik yang benar-benar terpakai dalam KB
STATstatus proses (R, S, D, Z, T) dan flag
TIMEtotal 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.

KodeStatusArti dalam praktik
RRunningsedang berjalan atau menunggu giliran di CPU
SInterruptible sleepmenunggu kejadian (jaringan, input, timer); status normal bagi sebagian besar proses
DUninterruptible sleepmenunggu I/O di dalam kernel, sinyal tidak dapat dikirim
ZZombiesudah selesai, tetapi induknya belum mengambil kode keluarnya
TStoppeddihentikan 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

TombolAksi
P / Murutkan berdasarkan CPU / memori
1tampilkan setiap core secara terpisah
cbaris perintah lengkap
ufilter berdasarkan pengguna
kkirim sinyal ke proses
rubah nice proses
Htampilkan thread
qkeluar

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.

  • F3 atau / — mencari proses berdasarkan nama;
  • F4 — filter yang hanya menampilkan yang cocok;
  • F5 atau t — 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.

SinyalNomorFungsi
SIGHUP1terminal terputus; banyak daemon membaca ulang konfigurasinya
SIGINT2interupsi, sama dengan Ctrl+C
SIGKILL9penghentian paksa oleh kernel, tidak bisa ditangkap
SIGTERM15permintaan untuk berhenti dengan rapi; default pada kill
SIGSTOP19jeda, tidak bisa ditangkap
SIGCONT18melanjutkan proses yang dijeda
SIGTSTP20jeda 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:

  1. Kirim kill PID (SIGTERM).
  2. Tunggu 5–30 detik sambil memeriksa dengan kill -0 PID.
  3. 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.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.

Ke kursus