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