راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

تمرین ها »
« Traps

فصل 12: گرفتن(ربودن) سیگنال‌ها

فهرست مطالب

سیگنال‌ها
مقدمه
کاربرد سیگنال‌ها با kill
Traps
کلیات
Bash چطور trapها را تفسیر می‌کند
مثال‌های بیشتر
خلاصه
تمرین‌ها

چکیده

در این فصل، در باره موضوعات زیر صحبت خواهیم نمود:

  • سیگنال‌های معتبر

  • استفاده از سیگنال‌ها

  • استفاده از دستور trap

  • چگونه از متوقف نمودن برنامه‌هایتان توسط کاربران ممانعت کنید

سیگنال‌ها

مقدمه

پیدا کردن صفحه man سیگنال

سیستم شما یک صفحه شامل لیست تمام سیگنال‌های معتبر دارد، اما به نسبت سیستم‌عامل شما، به روش‌های متفاوتی می‌تواند باز شود، . در اکثر سیستم‌های لینوکس، با دستور ‎ man 7 signal‎ انجام می‌شود. موقعی که مردد هستید، با استفاده از دستوری مانند

man -k signal | grep list

یا

apropos signal | grep list

صفحه و بخش دقیق آن را پیدا کنید. نام سیگنال‌ها را می‌توان با دستور ‎ kill -l‎ پیدا کرد.

سیگنال‌های پوسته Bash شما

در غیبت هرگونه trap، یک پوسته Bash محاوره‌ای از سیگنال SIGTERM و SIGQUIT صرف‌نظر می‌کند. سیگنالSIGINT گرفته می‌شود و به کار می‌رود، و اگر کنترل job فعال باشد، سیگنال‌های SIGTTIN و SIGTTOU و SIGTSTP نیز صرف‌نظر می‌شوند. دستوراتی که به عنوان نتیجه یک جایگزینی دستور اجرا شده‌اند نیز از این سیگنال‌ها موقعی که از طریق صفحه کلید تولید شده باشند، چشم‌پوشی می‌کنند.

سیگنال SIGHUP به طور پیش‌فرض موجب خروج از پوسته می‌شود. یک شل محاوره‌ای سیگنال SIGHUP را به تمام jobها ارسال خواهد کرد، اجرا یا توقف، اگر می‌خواهید این رفتار را برای یک پردازش خاص غیر فعال کنید، مستندات دستور داخلی disown را ببینید. گزینه huponexit را برای کشتن تمام jobهایی که سیگنال SIGHUP دریافت می‌کنند ، با استفاده از دستور داخلی shopt به کار ببرید.

ارسال سیگنال‌ها با استفاده از پوسته

سیگنال‌های زیر می‌توانند از پوسته Bash فرستاده شوند:

جدول 12.1: کنترل سیگنال‌ها در Bash

ترکیب کلیدی استانداردعملکرد
Ctrl+Cسیگنال وقفه، SIGINT را به job در حال اجرا در پیش‌زمینه ارسال می‌کند.
Ctrl+Yکاراکتر تأخیری تعلیق. موجب می‌شودموقعی که یک پردازش در حال اجرا قصد خواندن ورودی از ترمینال را دارد متوقف شود. کنترل به شل برگردانده می‌شود، کاربر می‌تواند پیش‌زمینه، پس‌زمینه یا پردازش kill باشد. تعلیق تأخیری فقط در سیستم عامل‌هایی که این ویژگی را پشتیبانی کنندمعتبر است.
Ctrl+Zسیگنال suspend، یک SIGTSTP به برنامه در حال اجرا می‌فرستد، بنابراین آن را متوقف می‌کند و کنترل را به شل باز می‌گرداند.

[Note]تنظیمات ترمینال

تنظیمات stty خود را بررسی کنید. اگر از شبیه‌سازهای «مدرن» ترمینال استفاده می‌کنید، تعلیق و ادامه خروجی به طور معمول غیر فعال است . شبیه‌ساز xterm استاندارد، از ‎ Ctrl+S‎ و ‎Ctrl+Q‎ به طور پیش‌فرض حمایت می‌کند.

کاربرد سیگنال‌ها با kill

اکثر پوسته‌های مدرن، از جمله Bash ، یک تابع داخلی kill دارند. در Bash، هم نام و هم شماره سیگنال‌ها به عنوان گزینه دریافت می‌شوند، و شناسه‌ها می‌توانند شماره شناسایی(ID) پردازش‌ها یا jobها باشند. یک وضعیت خروج می‌تواند با کاربرد گزینه ‎ -l‎ گزارش شود: صفر برای موقعی که حداقل یک سیگنال موفقیت‌آمیز ارسال شده باشد، غیر صفر در صورت وقوع یک خطا.

کاربرد دستور kill از ‎/usr/bin‎، سیستم شما می‌تواند گزینه‌های اضافه‌ای را فعال کند،، از قبیل توانایی کشتن پردازش‌ها غیر از ID کاربری خودتان، و تعیین پردازش‌ها با نام، ماننداستفاده از pgrep و pkill.

هر دو دستور kill اگر چیزی تعیین نشده باشد، سیگنال TERM را ارسال می‌کنند.

این لیستی از سیگنال‌های رایج است:

جدول 12.2: سیگنال‌های رایج kill

نام سیگنالمقدار سیگنالنتیجه
SIGHUP1Hangup
SIGINT2وقفه از صفحه کلید
SIGKILL9سیگنال Kill
SIGTERM15سیگنال پایان‌دهی
SIGSTOP17,19,23توقف پردازش

[Note]SIGKILL و SIGSTOP

SIGKILL و SIGSTOP نمی‌توانند گرفته، مسدود، یا صرف‌نظر بشوند.

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

اما اگر یک توقف پاکیزه کار نکند، سیگنال‌های INT یا KILL ممکن است تنها راه باشد. به عنوان نمونه، موقعی یک پردازش با استفاده از ‎ Ctrl+C‎ نمی‌میرد، بهترین راه استفاده از‎ kill -9 ‎ با ID پردازش است:

maud: ~> ps -ef | grep stuck_process
maud    5607   2214  0 20:05 pts/5    00:00:02 stuck_process

maud: ~> kill -9 5607

maud: ~> ps -ef | grep stuck_process
maud    5614    2214 0 20:15 pts/5    00:00:00 grep stuck_process
[1]+ Killed		stuck_process

موقعی که پردازش چندین مورد را شروع می‌کند، killall می‌تواند آسان‌تر باشد. این همان گزینه‌های فرمان kill را می‌پذیرد، اما بر تمام موارد یک پردازش ذکر شده اعمال می‌کند. قبل از اجرای این دستور در یک محیط عملیاتی آن را امتحان کنید، چون ممکن است روی برخی سیستم‌های تجاری آن‌طور که انتظار می‌رود کار نکند.

تمرین ها »
« Traps
ترجمه محمود پهلوانی