منبع اصلی نوشتار زیر در این لینک قرار دارد

آشنایی با BASH – بخش هجدهم (مفهوم Trap)

زمانیکه ctrl+c یا کلید Break از کی بورد را فشار می دهید برنامه یا شل اسکریپت در حال اجرا بلافاصله stop یا قطع می شود و سپس خط اعلان یا Command Prompt نشان داده می شود و می توانید دستور جدیدی را اجرا کنید. اما فرض کنید در زمان اجرای یک شل اسکریپت (مانند شل اسکریپتی برای گرفتن Backup) نمی خواهید اجرای آن با ارسال سیگنال Ctrl+C خاتمه یابد و به طور نرمال و پس از اتمام اجرای آن، خط اعلان نشان داده شود. در تمامی سیستم عامل های یونیکسی از Trap (یا تله) برای خنثی کردن اثر یک سیگنال استفاده می شود.

  • سیگنال 2 زمانی صادر می شود که کلید های Ctrl+C فشار داده شده و اجرای برنامه یا شل اسکریپت متوقف می شود. آنرا interrupt signal می گویند.
  • سیگنال 3 زمانی صادر می شود که کلید های Ctrl+D فشار داده شده و اجرای برنامه یا شل اسکریپت خاتمه می یابد. آنرا quit signal می گویند.
  • سیگنال 8 زمانی صادر می شود که یک خطای محاسباتی رخ دهد.
  • سیگنال 9 که برای KILL کردن فرایند استفاده می شود. فرایندی که این سیگنال را دریافت می کند بلفاصله اجرای آن متوقف می شود.
  • سیگنال 14 که سیگنال Alarm Clock نامیده می شود و مورد استفاده Timer است.
  • سیگنال 15 برای متوقف کردن نرمال فرایند استفاده می شود. در دستور kill این سیگنال پیشفرض است.

شکل کلی دستور trap به صورت زیر است که در آن به جای command نام یک برنامه یا دستور یا شل اسکریپت می آید و به جای signal یک یا چند عدد معادل سیگنال ها قرار می گیرد.

trap commands signals

trap برای دو مورد در یونیکس ها استفاده می شود :

  • پاک کردن فایل های موقتی یا Temporary Files
  • خنثی یا ignore کردن اثر یک سیگنال

پاک کردن فایل های موقتی

دستور زیر، اگر برنامه ای که در خط فرمان در حال اجرا باشد و سیگنال 2 را دریافت کنید آنگاه دو فایل work1$$ و $$dataout پاک خواهند شد.

trap “rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit” 2

تفسیر خط دستور بالا به این صورت است که نخست دو دستور rm  و exit با سمی کالن از هم جدا شده اند و میان دو  ” ” قرار گرفته اند. exit برای این است که پس از دریافت سیگنال 2 توسط دستور rm و فایل پاک شده و سپس با دستور exit اجرا خاتمه می یابد.

خنثی کردن سیگنال ها

اگر به جای command در فرم کلی چیزی نیاید (مانند زیر که به جای آن  ‘ ‘ استفاده کرده ایم)، آنگاه می توان اثر سیگنال ها را خنثی کرد. به طور مثال برای خنثی کردن اثر سیگنال 2 از دستور زیر استفاده کنید. دستور زیر که در آن وجود ‘ ‘ الزامی است، اثر سیگنال 2 را خنثی می کند و به محض دریافت سگینال Ctrl+C اثر آن خنصی می شود.

trap ‘ ‘ 2

البته می توان چندین سیگنال را با فاصله از هم نیز استفاده کرد.

trap ‘ ‘ 1 2 3 15

توجه کنید که در دو دستور بالا وجود ‘  ‘ الزامی است و دستوری مانند زیر منجر به بازگشت به عملکرد اصلی سیگنال می شود. یعنی خنثی بودن اثر آنرا از بین برده و از این پس سیگنال (های) فوق عملکرد معمول خود را از سر می گیرند.

trap 2

trap 1 2 3 15

کاربرد trap

یک کاربرد آن در shell script ها است. در ابتدای فایل به طور مثال می توانید اثر سیگنال های 2 و 3 و 9 و 15 را خنثی کنید و یا مانند شل اسکزیپت زیر در خط آخر فایل شل، پیش از خروج از اجرای شل و بازگشتن به خط اعلان، فایلی را پاک کنید که در ابتدای فایل شل تحت متغیر TMP ایجاد شده بود.

یا شل ساده زیر

مطالب مفید



برچسب ها : , , , , , , , , , , ,