Setiap program yang sedang jalan disebut process, dan tiap process punya nomor unik, PID (process ID). Mirip dapur restoran: tiap pesanan yang sedang dimasak punya nomor tiket. Mau membatalkan pesanan, kamu sebut nomornya, bukan nama masakannya, karena bisa saja ada dua nasi goreng yang dimasak bersamaan. Dan kamu bisa minta baik-baik ("tolong berhenti"), atau langsung mematikan kompornya.
🧪 Tebakan cepat: kamu menjalankan
kill 4230, tanpa-9. Process itu pasti berhenti, atau bisa tetap jalan? Tebak dulu, jawabannya ada di bagian "kill: mengirim signal".
Melihat process: ps aux
Di server sungguhan daftarnya panjang, ini potongannya:
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 167740 11904 ? Ss 08:00 0:02 /sbin/init
www-data 812 2.5 1.2 55320 24160 ? S 08:01 0:31 nginx: worker process
budi 4188 5.0 3.0 987364 98304 pts/1 Sl+ 09:02 0:41 node server.js
budi 4230 97.8 1.0 240112 32768 pts/2 R+ 09:05 2:14 python3 worker.py
budi 4301 0.0 0.0 11496 4608 pts/0 R+ 09:15 0:00 ps aux
aartinya process semua user,uformat lengkap dengan kolom USER,xtermasuk process yang gak punya terminal (?di kolom TTY). Tanpa opsi,pscuma menampilkan process di terminalmu.- USER pemiliknya, PID nomornya, %CPU dan %MEM pemakaian prosesor dan memori, COMMAND perintah yang menjalankannya.
- STAT statusnya:
Rsedang jalan,Stidur menunggu sesuatu,Tdijeda, dan+artinya dia sedang di depan terminalnya. worker.pymakan 97,8% CPU: kelihatannya macet. Danps auxikut muncul di daftarnya sendiri, karena waktu itu dia juga process yang jalan.
Mencari satu program biasanya pakai pipe ke grep:
$ ps aux | grep node
budi 4188 5.0 3.0 987364 98304 pts/1 Sl+ 09:02 0:41 node server.js
budi 4302 0.0 0.0 6612 2304 pts/0 S+ 09:15 0:00 grep --color=auto node
Baris kedua adalah grep itu sendiri: perintahnya mengandung kata node. pgrep -a node lebih bersih, dia cuma mencetak 4188 node server.js. Untuk memantau terus-menerus, pakai top atau htop (tekan q untuk keluar).
kill: mengirim signal
Signal adalah pesan pendek yang dikirim ke process. Namanya kill, tapi tugasnya mengirim signal, dan gak semua signal mematikan.
| Signal | Nomor | Dikirim oleh | Bisa ditangkap process? |
|---|---|---|---|
| SIGTERM | 15 | kill PID (default) |
ya: process bisa merapikan diri dulu |
| SIGKILL | 9 | kill -9 PID |
gak: sistem langsung menghentikannya |
| SIGINT | 2 | Ctrl+C | ya |
| SIGTSTP | 20 | Ctrl+Z | ya: process-nya dijeda |
| SIGHUP | 1 | terminal ditutup | ya |
$ kill 4188
$ kill 4230
$ pgrep -a python3
4230 python3 worker.py
$ kill -9 4230
$ kill 812
bash: kill: (812) - Operation not permitted
$ kill 4230
bash: kill: (4230) - No such process
kill 4188mengirim SIGTERM, artinya "tolong berhenti".node server.jsmenangkapnya, menutup server dengan rapi, lalu keluar. Kalau berhasil,killgak mencetak apa-apa.worker.pyjuga menerima SIGTERM, tapi handler-nya menunggu job yang macet, jadi dia tetap jalan. SIGTERM cuma permintaan: process boleh menangkapnya, bahkan mengabaikannya. Itu jawaban tebakannya.kill -9mengirim SIGKILL. Process gak bisa menangkapnya: sistem langsung menghentikannya, tanpa kesempatan merapikan apa pun. Pakai sebagai jalan terakhir.- Kamu cuma boleh mengirim signal ke process milikmu sendiri. nginx milik
www-data, jadi ditolak, kecuali pakaisudo. Dan PID yang sudah gak ada menjawabNo such process.
kill -15, kill -TERM dan kill -SIGTERM sama saja. Begitu juga kill -9, kill -KILL dan kill -SIGKILL.
Foreground dan background
Process yang jalan di foreground memegang terminalmu: kamu gak bisa mengetik perintah lain sampai dia selesai. Tanda & di akhir perintah menjalankannya di background:
$ node server.js &
[1] 4410
Server jalan di port 3000
$ jobs
[1]+ Running node server.js &
$ fg %1
node server.js
^C
[1]nomor job di terminal ini,4410PID-nya. Terminalnya langsung bisa dipakai lagi.jobsmenampilkan job di terminal ini, danfg %1membawa job 1 ke depan lagi.- Ctrl+C mengirim SIGINT ke process di depan, dan biasanya dia berhenti.
$ node server.js
Server jalan di port 3000
^Z
[1]+ Stopped node server.js
$ bg %1
[1]+ node server.js &
- Ctrl+Z mengirim SIGTSTP: process-nya dijeda, bukan dihentikan.
bg %1melanjutkannya di background,fg %1di depan. nohup perintah &membuat perintah tetap jalan walaupun terminalnya ditutup, karena dia mengabaikan SIGHUP.- Port 3000 dipakai process yang lupa dimatikan?
lsof -i :3000menunjukkan PID-nya, lalukillPID itu.
Membaca ps dengan JavaScript
Latihan pelajaran ini: parseProcessList mengubah output yang mirip ps aux, lima kolom USER PID %CPU %MEM COMMAND, jadi array of object.
function parseProcessList(psOutput) {
return psOutput.split("\n").map((line) => {
const parts = line.trim().split(/\s+/); // /\s+/ = satu spasi atau lebih
return {
user: parts[0],
pid: Number(parts[1]),
cpu: Number(parts[2]),
mem: Number(parts[3]),
command: parts.slice(4).join(" "), // sisanya, karena command boleh berspasi
};
});
}
console.log(parseProcessList("www 123 2.5 1.2 nginx: worker process"));
// [{ user: "www", pid: 123, cpu: 2.5, mem: 1.2, command: "nginx: worker process" }]
| Index | parts[i] |
Jadi |
|---|---|---|
| 0 | "www" |
user: "www" |
| 1 | "123" |
pid: 123, angka |
| 2 | "2.5" |
cpu: 2.5 |
| 3 | "1.2" |
mem: 1.2 |
| 4 sampai 6 | "nginx:", "worker", "process" |
command: "nginx: worker process" |
split("\n")memecah per baris, jadi dua baris menghasilkan dua object.Number("0.0")hasilnya0, danNumber("5.0")hasilnya5: angka, bukan teks.slice(4).join(" ")menyatukan lagi semua potongan mulai index 4, karena command bisa terdiri dari beberapa kata.
⚠️ Jebakan yang sering ketemu
- Langsung
kill -9. Process gak sempat menghapus file sementara, menyelesaikan tulisan ke file, atau menutup koneksi database. Kirimkillbiasa dulu, tunggu beberapa detik, baru-9kalau masih ada. grepmenemukan dirinya sendiri.ps aux | grep nodeselalu mencetak minimal satu baris, walaupun node gak jalan. Pakaipgrep.- Ctrl+Z dikira menghentikan. Process-nya cuma dijeda dan masih memegang port 3000, jadi menjalankan server lagi gagal dengan
Error: listen EADDRINUSE: address already in use :::3000. Bawa ke depan denganfg, lalu Ctrl+C. - Di latihan, angka masih teks atau command terpotong.
pid,cpudanmemharus angka (Number),commandadalah semua sisa kolom yang digabung dengan spasi, dan tiap baris jadi satu object.
TL;DR: Tiap program yang jalan adalah process dengan PID. ps aux menampilkan semuanya (a semua user, u format lengkap, x termasuk yang tanpa terminal); pgrep -a nama mencari PID tanpa ikut menemukan dirinya sendiri, dan top atau htop memantau langsung. kill PID mengirim SIGTERM (15), permintaan berhenti yang boleh ditangkap; kill -9 PID mengirim SIGKILL, paksa dan tanpa cleanup, jalan terakhir. Ctrl+C = SIGINT, Ctrl+Z = SIGTSTP (dijeda, bukan berhenti). & menjalankan di background, jobs, fg %1 dan bg %1 mengatur job. Di latihan, split(/\s+/), Number(...) untuk pid, cpu, mem, dan slice(4).join(" ") untuk command.