Satu terminal hanya punya satu prompt, dan secara bawaan prompt itu terikat pada satu perintah sampai selesai — kompresi arsip besar membuat kita hanya bisa menunggu. Padahal Linux sanggup menjalankan pekerjaan itu sendiri sementara terminal dipakai untuk hal lain. Inilah bedanya proses foreground yang menguasai prompt dan background yang bekerja di belakang layar. Chapter ini membahas tiga alatnya: operator &, penahanan lewat Ctrl+Z, dan nohup untuk proses yang tahan logout.
Foreground: Mode Bawaan yang Menahan Prompt #
Saat kita menekan Enter, bash menjalankan perintah sebagai proses foreground: shell memblokir dirinya sampai proses itu berakhir dan prompt tidak muncul. Jalan keluar cepat adalah Ctrl+C — mekanisme sinyalnya kita bedah di Chapter Signals dan Process Termination . Sering kali kita tidak ingin membatalkan, hanya ingin terminalnya kembali; dua cara berikut menjawab kebutuhan itu.
Operator & dan Variabel $! #
Aturannya satu kalimat: akhiri perintah dengan spasi dan &, maka bash tidak menunggu proses itu selesai — prompt langsung kembali. Bash tetap melakukan fork, tetapi tidak memanggil wait; proses hanya dicatat ke tabel job shell, dan di shell interaktif kelahirannya dilaporkan seperti [1] 18734. Mari kita buktikan proses background itu hidup dan bisa dikelola:
sleep 2 & pid=$!
ps -o comm= -p $pid
wait $pid
echo "pekerjaan latar selesai dengan exit status $?"Output yang Dihasilkan:
sleep
pekerjaan latar selesai dengan exit status 0Mari kita telaah blok di atas:
- Baris 1 (
sleep 2 & pid=$!):sleep 2dilempar ke background, lalu$!— PID background paling baru — ditampung kepid; nilainya berbeda tiap eksekusi, jadi ditampung, bukan dicetak. - Baris 2 (
ps -o comm= -p $pid): mencetak nama perintah milik proses bernomor$pidsaja; barissleepmembuktikan proses itu hidup meski prompt sudah bebas. - Baris 3-4 (
wait $piddanecho ... $?):waitmemblokir shell sampai proses itu berakhir, lalu status0membuktikansleepselesai normal.
Menunggu dan Menghentikan Proses Latar #
Dua perintah mengelola proses latar dari sisi shell: wait menunda shell sampai proses latar berakhir, dan kill mengirim sinyal agar proses berhenti. Blok berikut menghentikan pekerjaan lama di tengah jalan, lalu membuktikan PID-nya sudah tidak terpakai:
sleep 30 & pid=$!
kill $pid
wait $pid
echo "proses latar berhenti dengan exit status $?"
kill $pid 2>/dev/null
echo "kill pada PID yang sudah mati: exit $?"Output yang Dihasilkan:
proses latar berhenti dengan exit status 143
kill pada PID yang sudah mati: exit 1Mari kita telaah blok di atas:
- Baris 1-3 (
sleep 30 &,kill $pid,wait $pid): pekerjaan 30 detik dijalankan di background,killtanpa opsi mengirim sinyal SIGTERM — permintaan berhenti yang santun — laluwaitmemastikan proses benar-benar pergi sebelum baris berikutnya berjalan. - Baris 4: status
143adalah tanda tangan SIGTERM: proses yang mati karena sinyal dilaporkan sebagai128 + nomor sinyal, dan sinyal 15 adalah SIGTERM. - Baris 5-6:
killdipanggil lagi pada PID yang sudah mati dan gagal dengan status1; pesan errornya dibuang karena memuat angka PID yang berubah tiap eksekusi.
Ctrl+Z: Menunda Proses, Bukan Membatalkannya #
Cara ketiga menghadapi proses foreground yang terlanjur berjalan adalah menahannya: Ctrl+Z membekukan proses tepat di tempat — tidak selesai, tidak mati. Karena ini interaksi papan tombol di shell interaktif, berikut contoh tampilan sesinya, bukan output terverifikasi:
budi@laptop-budi:~$ sleep 600
^Z
[1]+ Stopped sleep 600
budi@laptop-budi:~$
Driver terminal mengubah Ctrl+Z menjadi sinyal SIGTSTP, proses berhenti dengan keadaan T (stopped) sementara memorinya tetap utuh di RAM, lalu bash melaporkan [1]+ Stopped — pekerjaan itu kini job nomor 1 dan prompt kembali. Proses yang ditahan bisa dilanjutkan kapan saja tanpa kehilangan kemajuan; pengelolaannya adalah inti Chapter Jobs dan Job Control
.
nohup: Membebaskan Proses dari Sesi Terminal #
Menutup terminal atau terputus dari SSH bukan peristiwa sunyi: kernel mengirim sinyal SIGHUP kepada proses yang menempel pada sesi itu, dan reaksi bawaan hampir semua proses adalah berhenti. Program nohup menjawabnya: proses dijalankan dengan SIGHUP yang diabaikan sehingga tetap hidup setelah logout. Berikut pola pemakaiannya yang utuh:
nohup bash -c 'echo "pekerjaan latar dimulai"; sleep 1; echo "pekerjaan latar selesai"' > laporan.txt 2>&1 &
pid=$!
wait $pid
echo "exit status nohup: $?"
cat laporan.txtOutput yang Dihasilkan:
exit status nohup: 0
pekerjaan latar dimulai
pekerjaan latar selesaiMari kita telaah blok di atas:
- Baris 1 (
nohup bash -c '...' > laporan.txt 2>&1 &):nohupmembungkusbash -c '...'yang mencetak dua pesan berjeda satu detik; keluarannya diarahkan kelaporan.txt, lalu&melemparkan semuanya ke background. - Baris 2-4 (
pid=$!,wait $pid,echo): menampung PID, menunggu selesai, lalu membuktikan prosesnya berakhir normal dengan status0. - Baris 5 (
cat laporan.txt): membuktikan keluaran pekerjaan tertampung di file.
Berikut contoh tampilan sesi interaktif dengan pola yang sama di server:
budi@server-kantor:~$ nohup bash laporan-penjualan.sh &
[1] 18734
budi@server-kantor:~$ nohup: ignoring input and appending output to nohup.out
budi@server-kantor:~$ exit
Pesan nohup: kadang muncul setelah prompt berikutnya tampil. Isinya dua kabar: masukan (stdin) dilepas dari terminal, dan keluaran ditampung ke file nohup.out di direktori kerja. Mengapa blok terverifikasi di atas tidak menghasilkan nohup.out? Karena nohup hanya membuat file itu bila stdout masih terhubung ke terminal; begitu stdout dialihkan ke file atau pipe, keluaran mengikuti pengalihan tersebut — jadi mengarahkan sendiri keluaran membuat perilaku perintah sama di mana pun. Detailnya ada di halaman manual nohup(1)
dan wiki ProcessManagement
.
Pola Daemon dan Peran disown #
Proses yang dirancang hidup selamanya — server web, sshd, cron — menempuh jalan lebih rapi: sejak lahir melepas diri dari terminal dan diadopsi init (PID 1); kelompok ini disebut daemon. Alternatif sehari-hari yang juga menolak SIGHUP adalah disown, yang melepas job yang sudah berjalan dari tabel job shell — kita bahas tuntas di Chapter Jobs dan Job Control
.
Kini terminal kita bebas sementara pekerjaan panjang jalan sendiri di latar. Tetapi & dan Ctrl+Z baru setengah cerita: shell mencatat setiap proses latar sebagai job bernomor yang bisa dipanggil, dilanjutkan, dan dilepas. Alat pengelola daftar itu — jobs, fg, bg, disown — menanti di Chapter Jobs dan Job Control
.