اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – قسمت ۹ – trap

اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – trap : اسکریپت های لینوکس با دریافت سیگنال شماره ۲ یا Ctrl + C به کار خود پایان میدهند. این اتفاق در برنامه های پیچیده ممکن است باعث بروز اشکال در عملکرد سیستم عامل شود. برنامه نویس ها معمولا یک روال برای چنین مواقعی در نظر میگیرند تا در صورت خروج ناگهانی از برنامه, این روال اجرا شده و همه چیز را به حالت عادی برگرداند. توضیحات تکمیلی با نوین هاست

اسکریپت نویسی پیشرفته لینوکس برای وبمستر ها – trap

برای تغییر رفتار سیگنال ها از دستور 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

نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *