برای انجام این کار روشهای بیشماری موجود است، اما تمام آنها محدود به ابزارهای در دسترس هستند. من به چاره سازیهای زیر رسیدم .
اگر میخواهید در انتظار تمام پردازشهای فرزند بمانید، به سادگی wait را بدون شناسه احضار کنید.
اگر فقط میخواهید منتظر برخی، اما نه تمام آنها، بمانید و نگران وضعیت خروج آنها نمیباشید، میتوانید wait را با PIDهای چندگانه فراخوانی کنید:
wait $pid1 $pid2
اگر نیاز دارید، بدانید آیا فرزند موفق یا ناموفق بوده، آنوقت شاید:
waitall() { # PID...
## .انتظار برای خروج فرزند و نمایش آنکه آیا همه با وضعیت صفر خارج شدهاند
local errors=0
while :; do
debug "Processes remaining: $*"
for pid in "$@"; do
shift
if kill -0 "$pid" 2>/dev/null; then
debug "$pid is still alive."
set -- "$@" "$pid"
elif wait "$pid"; then
debug "$pid exited with zero exit status."
else
debug "$pid exited with non-zero exit status."
((++errors))
fi
done
(("$#" > 0)) || break
# متوقف گردد؟ sleep وقتی فرزند خاتمه داده میشود، چطور این :برای انجام
sleep ${WAITALL_DELAY:-1}
done
((errors == 0))
}
debug() { echo "DEBUG: $*" >&2; }
pids=""
for t in 3 5 4; do
sleep "$t" &
pids="$pids $!"
done
waitall $pids
حلقهزنی بواسطه kill -0 میتواند بسیار بیکفایت باشد.
اطلاعات مفیدتر میتواند در صفحه مدیریت پردازش یافت شود.
پرسش و پاسخ 108 (آخرین ویرایش 2011-09-12 23:03:28 توسط GreyCat)