Dengan bash
, Anda akan memiliki jaminan itu kecuali Anda telah memulai pekerjaan latar belakang lain (dan berhati-hatilah bahwa pekerjaan latar belakang dapat dimulai dengan &
tetapi juga dengan coproc
dan dengan proses substitusi) antara foo &
dan wait
.
POSIX mensyaratkan shell mengingat status keluar dari setidaknya 25 pekerjaan setelah mereka pergi , tetapi bash
mengingat lebih dari itu.
Sekarang, jika Anda melakukannya:
foo & pid=$!
...
bar &
wait "$pid"
Anda tidak mendapat jaminan yang bar
tidak akan diberi pid yang sama dengan foo
(jika foo
telah dihentikan pada saat bar
dimulai), jadi meskipun tidak mungkin, wait "$pid"
dapat memberi Anda status keluar dari bar
.
Anda dapat mereproduksinya dengan:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
yang akan (pada akhirnya) memberi Anda 0
alih-alih 12
.
Untuk menghindari masalah, salah satu caranya adalah menuliskannya sebagai:
{
foo_pid=$!
while ps -p "$foo_pid"
do
ping -c 1 localhost
done
bar &
...
read <&3 ret
if [ "$ret" = 0 ]; then
echo foo was sucessful.
fi
} 3< <(foo > logfile 2>&1; echo "$?")
wait
tidak berfungsi. Proses dikumpulkan dan status keluar dibuang tepat sebelum prompt ditampilkan (secara default).wait %1
gagal dengan "tidak ada pekerjaan seperti" sebagai proses latar belakang dikumpulkan segera setelah "tidur 5" selesai.%1
di tempat$!
.bash -c '(sleep 1;exit 5) & sleep 2; wait %1; echo $?'
(jadi non-interaktif juga) gagal mendapatkan status keluar dari pekerjaan yang mati itu. Kedengarannya seperti bug.Saya yakin anggapan Anda benar. Berikut adalah kutipan dari
man bash
tentang menunggu proses latar belakang.Jadi mungkin Anda harus memeriksa 127
Ada pertanyaan serupa dengan jawaban yang sama sekali berbeda dari yang mungkin membantu.
Script Bash menunggu proses dan mendapatkan kode kembali
edit 1
Terinspirasi oleh komentar dan jawaban @ Stephane, saya telah memperluas skripnya. Saya dapat memulai sekitar 34 proses latar belakang sebelum mulai kehilangan jejak.
tback
pada sistem saya menghasilkan
sumber
bash -c '(exit 12) & sleep 1; wait "$!"; echo "$?"'
bash
jalur yang longgar (bahkan setelah memulai ribuan pekerjaan), contoh saya menunjukkan bahwa pid digunakan kembali, yang mungkin juga Anda amati dalam kasus Anda.