فهرست مطالب
چکیده
در این فصل، در باره موضوعات زیر صحبت خواهیم نمود:
سیگنالهای معتبر
استفاده از سیگنالها
استفاده از دستور trap
چگونه از متوقف نمودن برنامههایتان توسط کاربران ممانعت کنید
سیستم شما یک صفحه شامل لیست تمام سیگنالهای معتبر دارد، اما به نسبت سیستمعامل شما، به روشهای متفاوتی میتواند باز شود، . در اکثر سیستمهای لینوکس، با دستور man 7
signal انجام میشود. موقعی که مردد هستید، با استفاده از دستوری مانند
man
-k
signal | grep list
یا
apropos signal | grep
list
صفحه و بخش دقیق آن را پیدا کنید. نام سیگنالها را میتوان با دستور kill -l پیدا کرد.
در غیبت هرگونه 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 به برنامه در حال اجرا میفرستد، بنابراین آن را متوقف میکند و کنترل را به شل باز میگرداند. |
تنظیمات ترمینال | |
---|---|
تنظیمات stty خود را بررسی کنید. اگر از شبیهسازهای «مدرن» ترمینال استفاده میکنید، تعلیق و ادامه خروجی به طور معمول غیر فعال است . شبیهساز xterm استاندارد، از Ctrl+S و Ctrl+Q به طور پیشفرض حمایت میکند. |
اکثر پوستههای مدرن، از جمله Bash ، یک تابع داخلی kill دارند. در Bash، هم نام و هم شماره سیگنالها به عنوان گزینه دریافت میشوند، و شناسهها میتوانند شماره شناسایی(ID) پردازشها یا jobها باشند. یک وضعیت خروج میتواند با کاربرد گزینه -l
گزارش شود: صفر برای موقعی که حداقل یک سیگنال موفقیتآمیز ارسال شده باشد، غیر صفر در صورت وقوع یک خطا.
کاربرد دستور kill از /usr/bin
، سیستم شما میتواند گزینههای اضافهای را فعال کند،، از قبیل توانایی کشتن پردازشها غیر از ID کاربری خودتان، و تعیین پردازشها با نام، ماننداستفاده از pgrep و pkill.
هر دو دستور kill اگر چیزی تعیین نشده باشد، سیگنال TERM را ارسال میکنند.
این لیستی از سیگنالهای رایج است:
جدول 12.2: سیگنالهای رایج kill
نام سیگنال | مقدار سیگنال | نتیجه |
---|---|---|
SIGHUP | 1 | Hangup |
SIGINT | 2 | وقفه از صفحه کلید |
SIGKILL | 9 | سیگنال Kill |
SIGTERM | 15 | سیگنال پایاندهی |
SIGSTOP | 17,19,23 | توقف پردازش |
SIGKILL و SIGSTOP | |
---|---|
SIGKILL و SIGSTOP نمیتوانند گرفته، مسدود، یا صرفنظر بشوند. |
موقع کشتن پردازش یا یک سری از پردازشها، احساس مشترک، شروع آزمایش با کم خطرترین سیگنال، SIGTERM است. به این طریق، برنامههای مرقب خاموش شدن شسته رفته هستند امکان دنبال کردن رویههایی دارند که برای اجرا در زمان دریافت سیگنال SIGTERM طراحی شدهاند، ازقبیل پاکسازی و بستن فایلها. اگر شما یک SIGKILL به پردازش ارسال کنید، هرگونه شانس پردازش برای پاکسازی و خاموش شدن تمیز را از بین میبرید، که ممکن است نتایج تأسفباری داشته باشد.
اما اگر یک توقف پاکیزه کار نکند، سیگنالهای INT یا KILL ممکن است تنها راه باشد. به عنوان نمونه، موقعی یک پردازش با استفاده از Ctrl+C نمیمیرد، بهترین راه استفاده از kill -9
با ID پردازش است:
maud: ~>
ps-ef
| grepstuck_process
maud 5607 2214 0 20:05 pts/5 00:00:02 stuck_processmaud: ~>
kill-9
5607
maud: ~>
ps-ef
| grepstuck_process
maud 5614 2214 0 20:15 pts/5 00:00:00 grep stuck_process [1]+ Killed stuck_process
موقعی که پردازش چندین مورد را شروع میکند، killall میتواند آسانتر باشد. این همان گزینههای فرمان kill را میپذیرد، اما بر تمام موارد یک پردازش ذکر شده اعمال میکند. قبل از اجرای این دستور در یک محیط عملیاتی آن را امتحان کنید، چون ممکن است روی برخی سیستمهای تجاری آنطور که انتظار میرود کار نکند.