اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – trap : اسکریپت های لینوکس با دریافت سیگنال شماره ۲ یا Ctrl + C به کار خود پایان میدهند. این اتفاق در برنامه های پیچیده ممکن است باعث بروز اشکال در عملکرد سیستم عامل شود. برنامه نویس ها معمولا یک روال برای چنین مواقعی در نظر میگیرند تا در صورت خروج ناگهانی از برنامه, این روال اجرا شده و همه چیز را به حالت عادی برگرداند. توضیحات تکمیلی با نوین هاست …
برای تغییر رفتار سیگنال ها از دستور trap استفاده میکنیم.
ساختار دستور trap
ساختار کلی دستور به شرح زیر است:
trap ‘arg’ signals |
به مثال زیر دقت کنید:
#!/bin/bash # Program to print a text file with headers and footers TEMP_FILE=/tmp/printfile.txt trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM pr $1 > $TEMP_FILE echo -n "Print file? [y/n]: " read if [ "$REPLY" = "y" ]; then lpr $TEMP_FILE fi rm $TEMP_FILE |
در مثال زیر, در صورتی که برنامه با هر کدام از سیگنال های SIGHUP SIGINT SIGTERM بسته شود. سطر محتوی دار چهارم با دستور trap اول فایل موقت ایجاد شده را حذف میکند. سپس برنامه را میبندد.
توجه کنید که سیگنال SIGKILL یا همان سیگنال شماره ۹ قابل trap شدن نمیباشد و بلافاصله پس از دریافت موجب بسته شدن برنامه خواهد شد. برای ارسال چنین سیگنالی به سیستم عامل میتوانید از دستور kill -9 programname استفاده کنید. که البته موجب بروز مشکلاتی از قبیل باقی ماندن lockfile خواهد شد.
برای اینکه یک تابع پاکسازی جهت پاسخ به Ctrl+C ایجاد کنید. با دستور function طبق آموزشی که در جلسات قبل ارائه شد. یک تابع ایجاد کنید و دستورات مورد نظر را جهت پاکسازی در آن قرار دهید. تابع پاکسازی معمولا شامل حذف فایل های موقت. بازگردانی کانفیگ های موقت, فعال کردن سرویس هایی که موقتا غیر فعال شده ( مثلا شبکه!) و ذخیره سازی اطلاعاتLog میباشد.
تابع را در سطر های اولیه (قبل از دستورات اصلی) تعریف کنید و بلا فاصله بعد تعریف, دستور trap را بنویسید.
به مثال زیر توجه کنید:
#!/bin/bash # Program to print a text file with headers and footers TEMP_FILE=/tmp/printfile.txt function clean_up { # Perform program exit housekeeping rm $TEMP_FILE exit } trap clean_up SIGHUP SIGINT SIGTERM pr $1 > $TEMP_FILE echo -n "Print file? [y/n]: " read if [ "$REPLY" = "y" ]; then lpr $TEMP_FILE fi clean_up |
نکات مهم
در این مثال تابع پاکسازی با نام clean_up تعریف شده و دستور trap در صورت تشخیص سیگنال های خروج, اقدام به بستن آن میکند. در صورتی که نمیتوانید نام های SIGHUP SIGINT SIGTERM را به خاطر بسپارید. به جای آن از دستور
trap clean_up 2
استفاده کنید, این دستور برای واکنش به ctrl+c کافی است.
نام هایی که در مثال بالا استفاده کردیم, سیگنال های خروج تعریف شده در لینوکس هستند. جدول زیر مطرح ترین این سیگنال ها را نشان میدهد:
Signal Name | Signal Number | Description |
SIGHUP | ۱ | Hang up detected on controlling terminal or death of controlling process معمولا موقع قطع شدن ارتباط SSH رخ میدهد |
SIGINT | ۲ | Issued if the user sends an interrupt signal (Ctrl + C). |
SIGQUIT | ۳ | Issued if the user sends a quit signal (Ctrl + D). |
SIGFPE | ۸ | Issued if an illegal mathematical operation is attempted معمولا از خطا های داخل برنامه ناشی میشود. |
SIGKILL | ۹ | If a process gets this signal it must quit immediately and will not perform any clean-up operations این سیگنال به طور پیشفرض توسط دستور Kill استفاده میشود. |
SIGALRM | ۱۴ | Alarm Clock signal (used for timers) |
SIGTERM | ۱۵ | Software termination signal (sent by kill by default). |
برای مشاهده لیست کامل سیگنال ها, از دستور kill –l استفاده نمایید.
برای ارسال هرکدام از سیگنال ها کافیست از دستور kill به صورت زیر استفاده کنید:
kill -9 1001
مثال بالا سیگنال شماره ۹ را به پروسه شماره ۱۰۰۱ ارسال میکند.
با دستور
trap '' 2
میتوانید به طور کلی جلوی عملکرد ctrl+c را بگیرید.
برای بازگردانی trap ها به حالت اول از دستور زیر استفاده کنید:
trap 1 2