Sejauh ini kita memperlakukan terminal seperti kotak ajaib: ketik perintah, tekan Enter, hasil muncul. Di balik setiap Enter, shell melahirkan sesuatu yang hidup — sebuah process — yang diberi nomor, memakai memori, lalu mati begitu pekerjaannya selesai. Kita perlu kosakata ini sebelum bisa mengintip kegiatan sistem, menghentikan program yang macet, atau menjadwalkan tugas sendiri. Chapter ini meletakkan fondasinya, lalu menutup dengan /proc tempat kernel memajang data setiap proses.
Program Tergeletak di Disk, Proses Hidup di Memori #
Program hanyalah file — misalnya /bin/sleep — yang diam di filesystem. Proses adalah program yang sedang dijalankan: kernel memuat isinya ke memori, mencatat identitas pemiliknya, membuka file yang dibutuhkan, dan memberinya jatah waktu CPU. Satu program boleh dijalankan berkali-kali sekaligus; setiap eksekusi menghasilkan proses baru yang saling independen — kita menyebutnya sebuah instance. Data hidup proses — status, file terbuka, direktori kerja, environment — justru bisa kita baca dari /proc.
fork dan exec: Dua Langkah Lahirnya Proses #
Proses baru tidak muncul dari ketiadaan. Linux menyediakan dua system call yang bekerja berpasangan: fork() menggandakan proses yang sudah ada menjadi sepasang induk dan anak yang nyaris identik, lalu exec() mengganti isi proses anak dengan program yang baru. Ketika kita mengetik sleep 30, shell mem-fork dirinya, lalu anak hasil fork menjalankan exec() ke file /bin/sleep. Hubungan induk-anak itu bisa kita buktikan tanpa mencetak nomor PID, cukup lewat skrip kecil yang menanyakan nama induknya:
printf '#!/bin/bash\nps -o comm= -p $PPID\n' > anak.sh
chmod +x anak.sh
./anak.sh
echo "induk ditemukan"Output yang Dihasilkan:
bash
induk ditemukanMari kita bedah baris-barisnya:
- Baris 1-2 (
printf ... > anak.sh; chmod +x): membuat skrip kecilanak.shdan menandainya bisa dieksekusi. - Baris 3 (
./anak.sh): shell mem-fork dirinya, lalu anaknya menjalankanexec()ke skrip ini. Di dalamanak.sh, variabel khusus$PPIDberisi PID parent, danps -o comm= -p $PPIDmencetak hanya kolomcomm— nama perintahnya. - Baris 4-5 (
echo ...dan hasilnya):echomenandai skrip anak selesai, lalu hasilbashmembuktikan indukanak.shadalah bash yang menjalankan blok ini — setiap proses lahir dari proses lain.
PID, PPID, dan Pohon Silsilah Proses #
Setiap proses mendapat PID (process ID): nomor bulat unik selama prosesnya hidup, sedangkan PPID (parent PID) berisi PID proses yang melahirkannya. Karena setiap proses punya tepat satu induk, seluruh proses membentuk pohon silsilah yang berakar pada proses nomor 1 — init pada sistem klasik, systemd pada distribusi modern. Bila induk mati lebih dulu, anak yang masih hidup tidak ikut mati: kernel mengadopsinya ke proses 1, dan proses seperti ini disebut orphan. Sebaliknya, proses yang sudah selesai tetapi belum dibaca exit status-nya oleh induknya sempat menjadi zombie — entri kosong yang menunggu dibaca induknya lewat wait, perintah yang akan kita praktikkan pada Chapter Foreground dan Background Processes
.
Tampilan klasik untuk melihat PID dan PPID berdampingan adalah ps -f. Karena kolomnya berisi nomor PID yang berbeda pada setiap eksekusi, berikut contoh tampilannya pada satu sesi terminal, bukan output terverifikasi:
UID PID PPID C STIME TTY TIME CMD
budi 21001 20987 0 09:12 pts/0 00:00:00 -bash
budi 21543 21001 0 09:15 pts/0 00:00:00 sleep 30
budi 21599 21001 0 09:15 pts/0 00:00:00 ps -fBaris pertama adalah shell tempat Budi mengetik; dua baris berikutnya anak-anaknya — PPID sleep dan ps sama persis dengan PID bash.
/proc: Direktori yang Diciptakan Saat Dibaca #
Semua data proses tadi dipajang kernel di /proc — pseudo-filesystem yang kita kenal dari Filesystem Hierarchy Standard
. Setiap proses punya direktori sendiri bernama /proc/<pid>, dan pintas /proc/self selalu menunjuk ke proses yang sedang membacanya:
cat /proc/self/comm
cat /proc/self/cmdline | tr '\0' '\n'Output yang Dihasilkan:
cat
cat
/proc/self/cmdlineTelaah per barisnya:
- Baris 1 (
cat /proc/self/comm): filecommberisi nama program — dan karena pembacanya adalahcatsendiri, hasilnyacat. Inilah bukti/proc/selfmengikuti si pembaca. - Baris 2 (
cat /proc/self/cmdline | tr '\0' '\n'): filecmdlineberisi seluruh argumen command line proses, dipisah karakter NUL (\0);trmenggantinya dengan baris baru sehingga kedua argumen terbaca satu per satu.
Berikut file di /proc/<pid> yang paling sering dipakai, disaring dari daftar aslinya:
ls /proc/self | grep -E '^(comm|cmdline|status|stat|environ|cwd|exe)$' | sortOutput yang Dihasilkan:
cmdline
comm
cwd
environ
exe
stat
statusPerannya beragam: environ menyimpan variabel environment, cwd dan exe adalah symlink ke direktori kerja dan file programnya, sedangkan stat dan status merangkum keadaan proses beserta PID, PPID, dan memorinya. Dokumentasi semua field ada di halaman manual proc(5)
; standar POSIX fork
menjelaskan mekanisme fork().
Kini kita memegang kosakatanya: proses punya nama, nomor, induk, dan lemari data di /proc. Pertanyaan berikutnya: bagaimana mendaftar semua proses yang hidup dan menemukan yang paling rakus CPU? Itu pekerjaan ps dan top — materi Chapter ps, top, dan htop
.