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

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

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

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

پرسش و پاسخ شماره ۴۲

پرسش و پاسخ شماره ۴۲

چگونه می‌توانم دریابم که یک پردازش هنوز در حال اجرا است؟

فرمان kill برای ارسال سیگنالها به پردازش در حال اجرا به کار می‌رود. به عنوان یک عمل راحت، سیگنال "0" که موجود نیست می‌تواند برای پی بردن به در حال اجرا بودن یک پردازش به کار برود:

# Bourne
myprog &          # برنامه را در پس زمینه آغاز می‌کند
daemonpid=$!      # ...و شماره پردازش آن را ذخیره می‌کند

while sleep 60
do
    if kill -0 $daemonpid       # آیا پردازش هنوز زنده است؟
    then
        echo >&2 "OK - process is still running"
    else
        echo >&2 "ERROR - process $daemonpid is no longer running!"
        break
    fi
done

توجه: هر آنچه شمابرای شناسایی پردازشی که به طور ذاتی معیوب گردیده، انجام دهید به شماره شناسایی پرازشها(PID) متکی می‌باشد. اگر پردازشی بمیرد، به معنای آنست که PID آن تعریف نشده است. پردازش دیگری که بعد از آن آغاز می‌شود می‌تواند همان PID پردازش مرده را بگیرد. این موضوع می‌تواند باعث شود مثال قبلی فکر کند پردازش هنوز زنده است(شماره شناسایی آن وجود دارد!) ولواینکه آن پردازش مرده و از بین رفته است. به همین دلیل است که هیچ کس دیگری غیر از والد پردازش نباید سعی در مدیریت آن پردازش نماید. بخش مدیریت پردازش را بخوانید.

این یکی از آن پرسشهایی است که معمولاً مسئله عمیق‌تری را پوشش می‌دهد. نادر است که شخصی بخواهد بداند آیا پردازشی هنوز واقعاً در حال اجرا می‌باشد برای اینکه چراغ سبز یا قرمزی را برای متصدی روشن کند.

بیشتر اوقات، تقریباً انگیزه‌ای فراتر وجود دارد، ازقبیل تمایل به اطمینان از آنکه آیا سرویسی که به طور مکرر عامل از کار افتادن سیستم شناخته شده، بازهم در حال اجرا می‌باشد. اگر این حالت است، بهترین راه‌کار تصحیح برنامه یا پیکربندی آنست به طوریکه از کارافتادن متوقف شود. اگر نمی‌توانید این کار را انجام بدهید، پس فقط وقتی میمیرد restart کنید:

# POSIX
while true
do
  myprog && break
  sleep 1
done

این قطعه کُد برنامه myprog را اگر با کُد وضعیت دیگری غیر از صفر خاتمه یابد(نشان دهنده وجود یک اشتباه)، شروع مجدد (restart) می‌کند. اگر کُد وضعیت صفر است(به طور موفقیت آمیز تمام شود) حلقه پایان می‌یابد. (اگر پردازش شما سقوط می‌کند اما کد وضعیت صفر نیز برمی‌گرداند، پس کُد را طبق آن تنظیم کنید.) توجه نمایید که myprog باید در پیش زمینه اجرا شود. اگر به طور خودکار خودش را به حالت daemon می‌برد، شما مست هستید.

برای مباحثه بسیار بهتر در باره این مسائل مدیریت پردازش یا پرسش و پاسخ شماره 33 را ببینید.


CategoryShell

پرسش و پاسخ 42 (آخرین ویرایش ‎ 2012-10-27 10:38:13 ‎ توسط a88-114-128-29)