Topik ini meletakkan dasar pembahasan proses di Linux: nomor identitas proses, relasi induk dan anak, serta perbedaan proses latar depan dan latar belakang. Setelah membacanya, struktur pohon proses pada keluaran ps dapat dibaca dengan benar, dan pembagian kerja antara shell dengan program yang dijalankannya menjadi jelas. Konsep di topik ini dipakai terus-menerus oleh topik-topik berikutnya dalam modul ini.
Nomor PID dan proses pertama#
Proses (process) adalah program yang sedang dijalankan beserta sumber daya yang dipakainya. Ketika sebuah program dimulai, kernel memberinya nomor identitas yang disebut PID (process identifier), yaitu bilangan positif yang tidak dipakai oleh proses lain pada saat yang sama. Selama proses masih hidup, nomornya tidak berubah, dan hampir semua perintah pengelolaan proses menerima nomor ini sebagai sasarannya. Pada keluaran ps, nomor ini terbaca pada kolom PID.
Contoh berikut menampilkan proses dengan PID 1, yaitu proses pertama yang dibuat kernel ketika sistem menyala.
# proses pertama yang dibuat kernel ketika sistem menyala
ps -o pid,ppid,stat,cmd -p 1 PID PPID STAT CMD
1 0 Ss /usr/bin/tini -- /start.shOpsi -o memilih kolom yang ditampilkan, sedangkan opsi -p 1 memilih proses tertentu. Kolom PID berisi nomor prosesnya, PPID berisi PID induknya, STAT berisi kode keadaan, dan CMD berisi perintahnya. Pada lingkungan contoh, proses pertama adalah tini, program kecil yang menjaga container tetap hidup. Pada mesin latihan yang menjalankan Ubuntu, PID 1 biasanya dipegang systemd, sehingga nilai kolom CMD-nya berbeda, tetapi kedudukannya sebagai proses pertama tetap sama. Huruf S pada kolom STAT berarti proses sedang menunggu peristiwa (sleeping), sedangkan huruf kecil s tambahan menandai proses pemimpin sesi (session leader).
Diagram berikut memperlihatkan bentuk pohon proses pada sistem dengan systemd. Nomor PID di dalamnya bersifat ilustratif karena setiap sistem memberi nomor berbeda.
Relasi induk dan anak#
Setiap proses kecuali PID 1 dibuat oleh proses lain, dan proses pembuatnya disebut induk (parent). Shell yang menerima ketikan membuat proses baru dengan menyalin dirinya sendiri melalui mekanisme fork. Salinan tersebut kemudian mengganti citra programnya (program image) dengan perintah yang diminta melalui exec. Hubungan ini terekam dalam kolom PPID, sehingga pohon proses dapat dilacak ke atas sampai PID 1. Apabila induk selesai lebih dahulu, anak yang ditinggalkan diadopsi oleh proses pertama.
Contoh berikut melahirkan satu proses latar belakang, lalu membuktikan hubungan induk-anaknya.
# proses latar belakang menjadi anak dari shell yang menjalankannya
sleep 300 &
PID=$!
# jeda singkat agar proses anak selesai mengganti citranya
sleep 0.3
# kolom PID dan PPID ditandai N karena nilainya berbeda di setiap sesi
ps -o pid,ppid,stat,cmd -p "$PID" | awk 'NR>1{$1="N"; $2="N"} {$1=$1; print}'
# PPID proses tersebut dibandingkan dengan PID shell saat ini
test "$(ps -o ppid= -p "$PID" | tr -d ' ')" = "$$" && echo "PPID proses tersebut memang PID shell"
kill "$PID"
wait "$PID" 2>/dev/null
echo "proses dihentikan dengan status $?"PID PPID STAT CMD
N N S sleep 300
PPID proses tersebut memang PID shell
proses dihentikan dengan status 143Baris N N S sleep 300 menampilkan proses sleep dengan kolom PID dan PPID yang ditandai N, karena kedua nomor itu berbeda pada setiap eksekusi. Pengujian pada baris berikutnya membandingkan PPID proses tersebut dengan PID shell saat ini, dan kecocokannya membuktikan bahwa proses latar belakang memang anak dari shell. Perintah kill mengirim sinyal SIGTERM sehingga proses berakhir, dan status keluarnya menjadi 143, yaitu 128 ditambah nomor sinyal 15. Mekanisme sinyal dibahas lengkap pada topik sinyal di modul ini.
Proses latar depan dan latar belakang#
Perbedaan latar depan dan latar belakang ada pada sikap shell, bukan pada kedudukan proses di dalam pohon. Pada proses latar depan (foreground), shell menunggu perintah selesai sebelum menampilkan prompt kembali, dan terminal mengarahkan masukan papan ketik ke proses itu. Pada proses latar belakang (background) yang dijalankan dengan akhiran &, shell langsung kembali siap menerima perintah berikutnya, sedangkan prosesnya tetap berjalan dan tetap menjadi anak shell tersebut. Pembagian ini mengikuti cara kerja yang alami: pengolah teks dibuka di latar depan karena berinteraksi dengan papan ketik, sementara tugas panjang seperti pengarsipan dijalankan dengan & agar terminal tetap bisa dipakai.
# pekerjaan latar depan membuat shell menunggu sampai selesai
sleep 2
echo "shell kembali setelah perintah latar depan selesai"
# pekerjaan latar belakang langsung mengembalikan kendali ke shell
sleep 60 &
PID=$!
sleep 0.3
ps -o stat=,cmd= -p "$PID"
kill "$PID"
wait "$PID" 2>/dev/null
echo "proses latar belakang dihentikan dengan status $?"shell kembali setelah perintah latar depan selesai
S sleep 60
proses latar belakang dihentikan dengan status 143PID proses latar belakang yang baru dilahirkan disimpan shell dalam variabel khusus $!, sehingga proses itu dapat dirujuk tanpa mencari nomornya di keluaran ps. Kedua jenis proses tetap terekam di pohon yang sama dengan STAT S selama sedang menunggu. Yang membedakan hanyalah perilaku terminal: tombol Ctrl-C menghentikan proses latar depan karena sinyalnya dikirim ke kelompok proses latar depan, sedangkan proses latar belakang tidak terkena. Cara mengelola pekerjaan latar belakang dibahas lebih lanjut pada topik kendali pekerjaan.
Kesalahan umum#
- Menganggap PID milik sebuah program bersifat tetap. Nomor itu berbeda setiap kali program dijalankan dan dapat dipakai ulang oleh proses lain setelah yang lama berakhir. Selalu cari nomor terkini dengan
pssebelum mengirim sinyal. - Mengira akhiran
&membuat proses lepas dari terminal. Proses tersebut tetap anak dari shell dan masih menulis keluarannya ke terminal yang sama, dan penutupan terminal dapat mengakhiri proses itu melalui sinyal SIGHUP. Cara membuatnya bertahan dibahas pada topik kendali pekerjaan. - Mencampur adukkan proses dengan program. Berkas
/usr/bin/sleephanya satu, tetapi dapat dijalankan banyak orang sekaligus, sehingga terdapat banyak proses denganCMDyang sama dan PID yang berbeda-beda. - Mengira proses anak ikut berakhir ketika induknya berakhir. Anak yang ditinggalkan justru diadopsi oleh proses pertama dan terus berjalan, sehingga daftar
pssetelah penutupan satu sesi masih dapat memuat proses-proses warisan sesi tersebut.
Ringkasan#
- Kernel menandai setiap proses dengan PID yang unik pada satu saat, dan proses pertama di sistem memegang PID 1.
- Setiap proses kecuali PID 1 dibuat melalui fork dan exec oleh induknya, dan hubungan itu terbaca pada kolom
PPID. - Proses latar depan membuat shell menunggu, sedangkan proses latar belakang dengan
&langsung mengembalikan kendali dan PID-nya tersimpan di$!. - Kombinasi
ps -o pid,ppid,stat,cmd -p <PID>menampilkan identitas, induk, keadaan, dan perintah sebuah proses dalam satu keluaran.
Referensi#
- fork(2) — Linux man-pages project — Mekanisme pembuatan proses anak sebagai salinan induknya.
- ps(1) — Linux man-pages project
— Daftar kolom yang dapat dipilih dengan opsi
-o, termasuk pid, ppid, dan stat. - proc(5) — Linux man-pages project — Berkas /proc/[pid]/stat yang memuat keadaan proses dan huruf-huruf pada kolom STAT.