wait
adalah perintah yang menunggu pekerjaan yang diberikan selesai dan mengembalikan status keluar dari perintah yang ditunggu.
Sejak wait
perintah mempengaruhi lingkungan eksekusi shell saat ini, ini diimplementasikan sebagai perintah bawaan di sebagian besar shell.
Dalam artikel ini, kita akan menjelajahi wait
bawaan Bash perintah.
Bash wait
Perintah #
Sintaks umum wait
built-in mengambil bentuk berikut:
wait [options] ID
ID
adalah proses atau ID pekerjaan. Jika tidak ada ID
ditentukan, perintah menunggu sampai semua pekerjaan latar belakang anak selesai.
wait
perintah mengembalikan status keluar dari perintah terakhir yang ditunggu.
Misalnya, untuk menunggu proses latar belakang dengan PID 7654
, Anda akan menggunakan:
wait 7654
Ketika beberapa proses diberikan, perintah menunggu semua proses selesai.
Pekerjaan ditentukan menggunakan spesifikasi pekerjaan (“jobspec”), yang merupakan cara untuk merujuk pada proses yang membentuk pekerjaan. Spesifikasi pekerjaan dimulai dengan simbol persentase diikuti dengan nomor pekerjaan (%n
). Ini contohnya:
Jalankan perintah di latar belakang:
rsync -a /home /tmp/home &
ID pekerjaan shell (dilingkari dengan tanda kurung) dan ID proses akan ditampilkan di terminal Anda:
[2] 54377
Untuk menunggu pekerjaan, jalankan wait
perintah diikuti dengan spesifikasi pekerjaan:
wait %2
Saat dipanggil dengan -n
opsi, perintah hanya menunggu satu pekerjaan dari pid atau spesifikasi pekerjaan yang diberikan untuk diselesaikan dan mengembalikan status keluarnya. Jika tidak ada argumen yang diberikan, wait -n
menunggu pekerjaan latar belakang selesai dan mengembalikan status keluar pekerjaan.
wait -n 45432 54346 76573
Pada contoh di atas, wait -n
hanya mencetak status pengembalian pekerjaan yang keluar terlebih dahulu; itu tidak menunjukkan PID pekerjaan. Jika Anda ingin mendapatkan pid pekerjaan atau spesifikasi pekerjaan yang status keluarnya dikembalikan, gunakan -p
opsi untuk menetapkannya ke variabel:
wait -p job_id -n 45432 54346 76573
-p
opsi diperkenalkan di Bash 5.1. Jika Anda menggunakan versi Bash yang lebih lama, Anda akan mendapatkan kesalahan "opsi tidak valid".
-f
opsi memberitahu wait
untuk menunggu setiap pid atau jobspec benar-benar berakhir sebelum mengembalikan kode keluarnya, daripada kembali ketika status pekerjaan diubah. Opsi ini hanya berlaku jika kontrol pekerjaan diaktifkan. Secara default, kontrol pekerjaan diaktifkan hanya untuk perintah interaktif.
Contoh #
wait
biasanya digunakan dalam skrip shell yang menelurkan proses anak yang dijalankan secara paralel.
Untuk mengilustrasikan cara kerja perintah, buat skrip berikut:
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
Mari kita jelaskan kode baris demi baris:
- Baris pertama disebut shebang dan memberi tahu sistem operasi penerjemah mana yang akan digunakan untuk mengurai sisa file.
- Kami menggunakan
sleep
perintah untuk meniru proses latar belakang yang memakan waktu. $!
adalah variabel Bash internal yang menyimpan PID dari pekerjaan terakhir yang dijalankan di latar belakang. Dalam contoh ini, itu adalah PID darisleep
memerintah. Kami menyimpan PID dalam variabel (process_id
).- Mencetak nomor PID.
- PID diteruskan ke
wait
perintah yang menunggu sampaisleep
perintah selesai. - Mencetak status keluar dari
wait
memerintah.$?
adalah variabel Bash internal yang menyimpan status keluar dari perintah terakhir yang dieksekusi.
Jika Anda menjalankan skrip, itu akan mencetak sesuatu seperti ini:
PID: 36353
Exit status: 0
Berikut contoh menggunakan -n
pilihan:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
Ketika skrip dieksekusi, itu memunculkan 3 proses latar belakang. wait -n
menunggu sampai pekerjaan pertama selesai dan pernyataan gema dicetak. wait
menunggu semua pekerjaan latar belakang anak selesai.
first job completed
all jobs completed
Contoh terakhir menjelaskan -f
pilihan. Buka terminal dan jalankan:
sleep 3600 &
[1] 46671
Tunggu prosesnya:
wait 46671
Buka terminal lain dan hentikan proses dengan kill
perintah:
kill -STOP 46671
Setelah status proses diubah, wait
perintah akan menyelesaikan dan mengembalikan kode keluar proses.
Sekarang, ulangi langkah yang sama, tetapi kali ini gunakan wait -f $pid
:
sleep 3600 &
wait -f 46671
Hentikan proses dari terminal lain:
kill -STOP 46671
Kali ini wait
perintah tidak akan selesai. Ini akan berjalan sampai sleep
proses berakhir.
Kesimpulan #
wait
perintah menunggu pekerjaan yang ditentukan selesai dan mengembalikan kode keluar dari pekerjaan.