Lewati ke isi

Server & Infrastruktur

Cara Mematikan Proses yang Macet dengan kill di Linux

Cara menemukan PID dan menghentikan proses macet dengan kill, pkill, dan killall, kapan memakai SIGTERM atau kill -9, dan kenapa proses bisa hidup lagi.

Terbit 5 menit baca

Jawaban singkat

Temukan PID dengan pgrep atau top, lalu hentikan dengan kill PID yang mengirim SIGTERM agar program menutup diri dengan rapi. Pakai kill -9 hanya bila proses tidak merespons. Untuk service, gunakan systemctl stop atau restart supaya tidak dihidupkan ulang otomatis.

Daftar isi
  1. Bagaimana menemukan PID proses yang macet?
  2. Sinyal yang perlu kamu kenal
  3. Langkah aman menghentikan proses
  4. Kapan memakai pkill dan killall?
  5. Kenapa proses yang sudah di-kill hidup lagi?
  6. Proses yang tidak bisa dihentikan
  7. Pertanyaan yang sering diajukan

Untuk mematikan proses yang macet, cari dulu nomor prosesnya (PID), kirim kill PID, tunggu beberapa detik, dan baru pakai kill -9 PID bila proses itu tetap tidak mau berhenti.

Kenapa urutannya penting? Karena kill sebenarnya bukan "membunuh", melainkan mengirim sinyal. Sinyal bawaan meminta program berhenti dengan sopan: menyelesaikan tulisan ke disk, menutup koneksi database, dan menghapus file sementara. kill -9 memaksa kernel langsung menghentikannya tanpa kesempatan beres-beres. Untuk database atau aplikasi yang sedang menulis data, perbedaan ini bisa berarti data utuh atau data rusak.

Bagaimana menemukan PID proses yang macet?

Beberapa cara, dari yang paling praktis:

  • pgrep -a php: menampilkan PID beserta perintah lengkap untuk proses yang namanya mengandung "php".
  • pidof nginx: PID untuk program dengan nama persis.
  • ps aux --sort=-%cpu | head: proses dengan pemakaian CPU tertinggi.
  • top atau htop: lihat kolom PID sambil mengurutkan berdasarkan CPU atau memori. Cara membacanya ada di cara melihat proses dengan top dan htop.
  • sudo ss -ltnp | grep :3000: proses yang memakai port 3000, berguna saat aplikasi gagal jalan karena "address already in use".

Pastikan PID yang kamu catat memang proses yang dimaksud. Salah ketik satu angka bisa menghentikan proses lain.

Untuk port yang tertahan, ada jalan pintas sudo fuser -k 3000/tcp, yang langsung mengirim SIGKILL ke proses pemakai port tersebut. Perintah fuser berasal dari paket psmisc. Karena sinyalnya langsung SIGKILL, gunakan hanya bila kamu sudah yakin proses apa yang memegang port itu, misalnya sisa aplikasi pengembangan yang lupa dimatikan.

Sinyal yang perlu kamu kenal

SinyalNomorCara kirimEfek
SIGTERM15kill PIDBawaan. Meminta program berhenti dengan rapi
SIGINT2kill -INT PID atau Ctrl+CSama seperti menekan Ctrl+C di terminal
SIGHUP1kill -HUP PIDBanyak daemon memuat ulang config, bukan berhenti
SIGKILL9kill -9 PIDDihentikan paksa oleh kernel, tidak bisa ditolak
SIGSTOP19kill -STOP PIDMembekukan proses sementara
SIGCONT18kill -CONT PIDMelanjutkan proses yang dibekukan

Nomor SIGSTOP dan SIGCONT di atas berlaku untuk Linux di arsitektur x86 dan ARM. Supaya tidak salah, menulis nama sinyal (misalnya -TERM, -KILL) lebih aman daripada nomornya. Daftar lengkap bisa dilihat dengan kill -l.

Langkah aman menghentikan proses

  1. Kirim sinyal biasa: kill 12345. Bila proses milik user lain atau root, tambahkan sudo.
  2. Tunggu beberapa detik, lalu cek: ps -p 12345. Bila tidak muncul lagi, proses sudah berhenti.
  3. Bila masih ada, paksa: kill -9 12345.
  4. Cek log aplikasi untuk mencari tahu kenapa proses macet, supaya tidak terulang.

kill tidak mengeluarkan pesan apa pun bila berhasil. Pesan "No such process" berarti PID itu sudah tidak ada, sedangkan "Operation not permitted" berarti kamu perlu sudo.

Kapan memakai pkill dan killall?

Bila ada banyak proses dengan nama sama, misalnya puluhan worker skrip yang macet, mengirim kill satu per satu merepotkan. Ada dua alternatif:

  • pkill nama: menghentikan semua proses yang namanya cocok. Tambahkan -f untuk mencocokkan perintah lengkap, misalnya pkill -f "python3 worker.py".
  • killall nama: menghentikan semua proses dengan nama persis. Di AlmaLinux minimal, perintah ini ada di paket psmisc yang mungkin perlu dipasang dulu.

Keduanya mengirim SIGTERM secara bawaan, dan bisa diberi -9 bila perlu. Selalu jalankan pgrep -a nama dulu untuk melihat proses apa saja yang akan kena. Pola yang terlalu umum, seperti pkill -f php, bisa ikut menghentikan PHP-FPM yang melayani website.

Kenapa proses yang sudah di-kill hidup lagi?

Ini kebingungan yang paling sering. Bila proses itu bagian dari service, pengelolanya akan menyalakannya kembali. systemd dengan pengaturan Restart=always atau Restart=on-failure, PM2 untuk aplikasi Node.js, dan Docker dengan kebijakan restart semuanya bekerja seperti ini. Itu fitur, bukan bug.

Untuk service, gunakan pengelolanya:

  • sudo systemctl stop nama-service untuk menghentikan, atau restart untuk menyalakan ulang.
  • systemctl status 12345: menunjukkan service mana pemilik PID tersebut.
  • pm2 stop nama-app atau docker stop nama-container sesuai cara aplikasi dijalankan.

Cara membuat service yang otomatis bangkit bila gagal ada di cara membuat service systemd.

Proses yang tidak bisa dihentikan

Ada dua kasus di mana kill -9 pun tampak tidak berpengaruh:

  • Status D (uninterruptible sleep) di kolom S pada top. Proses sedang menunggu I/O, misalnya disk yang bermasalah atau share NFS yang putus. Sinyal baru diproses setelah I/O selesai. Penyebabnya harus diperbaiki di sisi disk atau jaringan, dan kadang satu-satunya jalan adalah reboot.
  • Status Z (zombie). Proses sudah selesai, hanya tersisa catatannya. Zombie tidak bisa di-kill karena memang sudah mati. Hentikan atau restart proses induknya (lihat kolom PPID dengan ps -o ppid= -p PID), maka zombie ikut hilang.

Satu lagi: bila prosesmu berhenti sendiri tanpa kamu kirim sinyal apa pun, mungkin kernel yang menghentikannya karena RAM habis. Cek dengan sudo dmesg -T | grep -i "killed process" atau journalctl -k | grep -i oom.

Proses yang kamu jalankan manual di SSH juga ikut berhenti saat koneksi putus, karena menerima SIGHUP. Untuk pekerjaan panjang, jalankan di dalam screen atau tmux.

Pertanyaan yang sering diajukan

Apakah kill -9 bisa merusak data?

Bisa. Program tidak sempat menyimpan isi buffer atau menutup file dengan rapi, sehingga file yang sedang ditulis bisa tidak lengkap. Database umumnya punya mekanisme pemulihan, tetapi tetap lebih aman memakai SIGTERM atau systemctl stop lebih dulu.

Bagaimana menghentikan semua proses milik satu user?

Jalankan sudo pkill -u namauser. Periksa dulu dengan pgrep -u namauser -a supaya tahu proses apa saja yang akan berhenti.

Bagaimana membatasi waktu jalan sebuah perintah supaya tidak macet?

Gunakan perintah timeout, misalnya timeout 300 ./skrip.sh. Setelah 300 detik, skrip dikirimi SIGTERM. Tambahkan -k 10 agar dikirimi SIGKILL bila masih hidup 10 detik kemudian.

Sumber & referensi

Baca juga