Konsep Proses

PID, relasi induk-anak, serta proses latar depan dan latar belakang.

Daftar isi

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.

bash
# proses pertama yang dibuat kernel ketika sistem menyala
ps -o pid,ppid,stat,cmd -p 1
text Keluaran
  PID  PPID STAT CMD
    1     0 Ss   /usr/bin/tini -- /start.sh

Opsi -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.

systemdPID 1sshdPID 1200bashPID 2150editor teksPID 2210, PPID 2150sleepPID 2280, PPID 2150
Pohon proses: setiap proses dilahirkan oleh satu induk dan ditandai PID serta PPID

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.

bash
# 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 $?"
text Keluaran
PID PPID STAT CMD
N N S sleep 300
PPID proses tersebut memang PID shell
proses dihentikan dengan status 143

Baris 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.

bash
# 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 $?"
text Keluaran
shell kembali setelah perintah latar depan selesai
S    sleep 60
proses latar belakang dihentikan dengan status 143

PID 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 ps sebelum 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/sleep hanya satu, tetapi dapat dijalankan banyak orang sekaligus, sehingga terdapat banyak proses dengan CMD yang 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 ps setelah 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#