آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۱۰۸

پرسش و پاسخ شماره ۱۰۸

چطور در انتظار انجام چند پردازش فرزند بمانم؟

برای انجام این کار روشهای بیشماری موجود است، اما تمام آنها محدود به ابزارهای در دسترس هستند. من به چاره سازی‌های زیر رسیدم .

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

اطلاعات مفیدتر می‌تواند در صفحه مدیریت پردازش یافت شود.


CategoryShell

پرسش و پاسخ 108 (آخرین ویرایش ‎2011-09-12 23:03:28‎ توسط GreyCat)