برای انجام این کار روشهای بیشماری موجود است، اما تمام آنها محدود به ابزارهای در دسترس هستند. من به چاره سازیهای زیر رسیدم .
اگر میخواهید در انتظار تمام پردازشهای فرزند بمانید، به سادگی 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)