سیگنالها در لینوکس
فرمان kill به منظور پایان دادن پروسهها استفاده میشود. این فرمان ما را قادر میسازد تا اجرای یک برنامه را که رفتار بدی دارد و باعث اختلال در سیستم شده است را متوقف کنیم:
[me@linuxbox ~]$ xlogo & [1] 28401 [me@linuxbox ~]$ kill 28401 [1]+ Terminated xlogo
ابتدا برنامه xlogo را در پسزمینه اجرا میکنیم. شل PID پروسه را چاپ میکند. سپس از فرمان kill برای از بین بردن پروسه استفاده میکنیم.
به این منظور پس از فرمان kill شماره PID را وارد کنید:
kill 28401
فرمان kill دقیقاً پروسه را از بین نمیبرد. بلکه به جای آن سیگنالهایی برای آن ارسال میکند. سیگنالها یکی از انواع روشهای مختلفی هستند که سیستمعامل با برنامهها ارتباط برقرار میکند. ما قبلا با استفاده از Ctrl+C و Ctrl+Z این ارتباط را مشاهده کردهایم. وقتی که ترمینال این کلیدها را دریافت میکند سیگنالی برای برنامه ارسال میکند. در مورد Ctrl+C یک سیگنال با نام INT (interrupt) ارسال میکند و زمانی که Ctrl+Z را فشار میدهیم یک سیگنال با نام TSTP (Terminal Stop) را ارسال مینماید. برنامهها در عوض به سیگنالها گوش میکنند.
این واقعیت که یک برنامه میتواند گوش فرا دهد و در برابر سیگنالها عمل کند آنها را قادر میسازد که کارهایی مثل ذخیره کار در حین رخداد را در حالتی انجام دهد که سیگنال تخریب را دریافت میکند.
ارسال سیگنال به فرآیندها با فرمان kill
رایجترین ترکیب برای فرمان kill به این شکل است:
kill [-signal] PID…
اگر هیچ سیگنالی به خط فرمان اختصاص نیابد، سیگنال TERM (Terminate) به صورت پیشفرض ارسال میشود. فرمان kill اغلب به منظور ارسال سیگنالهایی که در جدول زیر وجود دارد، استفاده میشود:
| شماره | نام | مفهوم |
|---|---|---|
| 1 | HUP | Hang Up این بافی مانده روزهای قدیم است که ترمینالها به کامپیوتر از طریق خطوط تلفن و مودمها متصل بودند، سیگنال استفاده میشد تا به برنامهها نشان دهند که ترمینال کنترلکنننده قطع شده است. تاثیر این سیگنال را میتوان با بستن یک نشست ترمینال نشان داد. در این حال برنامههای در حال اجرا در نمای جلویی ترمینال به سیگنال را دریافت کرده و بسته خواهد شد. |
| 2 | INT | Interrupt یا وقفه. همان عملکرد Ctrl+C را انجام میدهد. این سیگنال معمولا یک برنامه را از بین میبرد. |
| 9 | KILL | KILL این سیگنال ویژه است. نظر به اینکه برنامهها ممکن است سیگنالها را به شیوهای متفاوت بکار ببرند. مثل نادیده گرفتن سیگنالها در این وضعیت سیگنال KILL هرگز به برنامه هدف ارسال نمیشود. وقتی که یک پروسه به شیوهای از بین میرود که هنوز در حالت درگیری باقی میماند و پاک نمیشود. سیگنال KILL به عنوان آخرین چاره برای نابود پروسه استفاده میشود. |
| 15 | TERM | Terminate این سیگنال پیشفرض است که توسط فرمان Kill ارسال میگردد. اگر یک پروسه هنوز زنده است که سیگنالی را دریافت کند. این سیگنال آن را از بین خواهد برد. |
| 18 | CONT | Continue این یک پروسه را پس از برخورد با سیگنال STOP بازیابی خواهد کرد. |
| 19 | STOP | Stop این سیگنال باعث میشود که یک پروسه متوقف شده بدون اینکه تخریب گردد سیگنال KILL این سیگنال نیز به پروسه هدف ارسال نمیشود در نتیجه نمیتواند نادیده گرفته شود. |
حال، این فرمان را امتحان میکنیم:
[me@linuxbox ~]$ xlogo & [1] 13546 [me@linuxbox ~]$ kill -1 13546 [1]+ Hangup xlogo
در این مثال برنامه xlogo را در پسزمینه اجرا کرده و سپس برای آن یک سیگنال HUP را به همراه kill ارسال میکنیم. در نتیجه برنامه xlogo ایان یافته و Shell حاکی از آن است که پروسه پسزمینه یک سیگنال Hangup دریافت کرده است. ممکن است برای مشاهده پیام، لازم باشد چندین بار Enter را فشار دهید. توجه داشته باشید که سیگنال ممکن است از طریق شماره و یا نام (شامل اسامی که حروف پیشوند SIG دارند) مشخص شود.
[me@linuxbox ~]$ xlogo & [1] 13601 [me@linuxbox ~]$ kill -INT 13601 [1]+ Interrupt xlogo [me@linuxbox ~]$ xlogo & [1] 13608 [me@linuxbox ~]$ kill -SIGINT 13608 [1]+ Interrupt xlogo
مثال بالا را امتحان کنید و دیگر سیگنالها را آزمایش کنید. به خاطر داشته باشید که شما میتوانید از jobspecها نیز به جای PIDها استفاده کنید.
پردازشها نیز شبیه فایلها دارای مالک هستند و شما بایستی مالک یک پروسه (و یا کاربر ارشد باشید) تا بتوانید پروسه را با استفاده از kill از بین ببرید.
علاوه بر سیگنالهایی که در جدول قبلی یافت میشوند که اغلب هم به همراه kill به کار برده میشوند، جدول زیر سیگنالهای رایج دیگر را لیست کرده است:
| شماره | نام | مفهوم |
|---|---|---|
| 3 | QUIT | خروج |
| 11 | SEGV | Segmentation violation این سیگنال در صورتی ارسال میگردد که یک برنامه به صورت غیرقانونی از رم استفاده کند. |
| 20 | TSTP | Terminal Stop این سیگنالی است که وقتی ترمینال میفرستد که Ctrl+Z را وارد کنید. بر خلاف TStop Stop توسط برنامه دریافت میگردد ولی برنامه ممکن است آن را نادیده بگیرد. |
| 28 | WINCH | Window Change این سیگنالی است که توسط سیستم زمانی که اندازه یک پنجره را تغییر میدهید ارسال میگردد. برخی برنامهها شبیه less و top به نحوی این سیگنال پاسخ میدهد تا اندازه خود را در پنجره هم اندازه کنند. |
برای دریافت لیستی کاملتر از سیگنالها از فرمان زیر استفاده کنید:
[me@linuxbox ~]$ kill -l
ارسال سیگنالها به چندین فرآیند با فرمان killall
همچنین ممکن است که سیگنالهایی را به چندین فرآیند که یک برنامه یا نام کاربری مشترک دارند را ارسال کنید. با استفاده از ترکیب زیر چگونگی استفاده از فرمان killall قابل پیادهسازی است:
killall [-u user] [-signal] name…
برای شرح بیشتر، چندین نمونه از برنامه xlogo را آغاز کرده و سپس با killall همگی را نابود میکنیم:
[me@linuxbox ~]$ xlogo & [1] 18801 [me@linuxbox ~]$ xlogo & [2] 18802 [me@linuxbox ~]$ killall xlogo [1]- Terminated xlogo [2]+ Terminated xlogo
به یاد داشته باشید که دست مثل فرمان kill برای استفاده از killall نیاز به مجوزهای کاربر ارشد (Super User) دارید.
دیگر فرمانهای مرتبط با پروسهها
از آنجایی که مانیتور پروسهها یک وظیفه پراهمیت مدیریت سیستم است، فرمانهای زیادی برای این کار در نظر گرفته شدهاند. جدول زیر لیستی از این فرمانها را نشان میدهد:
| فرمان | شرح |
|---|---|
| pstree | ارسال خروجی از لیست مرتب در یک الگوی درختیشکل که رابطه والد و فرزندی بین پروسهها را نشان میدهد. |
| vmstat | ارسال خروجی یک تصویر از منابع در حال استفاده حافظه، swap و دیسک. برای داشتن یک نمایش دایمی یک زمان وقفه را به ثانیه پس از فرمان بیاورید. مثل vmstat 5 |
| xload | یک برنامه گرافیکی که یک گراف حاوی بار سیستم هست را نمایش میدهد. |
| tload | شبیه xload ولی بار گراف را در داخل ترمینال میکشد. |
درباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.
دیدگاهتان را بنویسید