منبع اصلی نوشتار زیر در این لینک قرار دارد

چهار راه برای kill نمودن یک فرآیند در گنو/لینوکس

killفرمان kill علیرغم اسم زشت و خشنی که دارد اصلا قاتل نیست و قرار هم نیست که قتلی را انجام بدهد.
این فرمان مظلوم، یک قاصدک است و فقط  اطلاع رسانی می نماید وقتی شما این فرمان را وارد می نمایید،kill  به سیستم عامل از طریق system call    اطلاع  می دهد که برو و به فلان پروسس بگو که به فلان دلیل بایستی سیستم را ترک نماید و سیستم عامل پس از کنترل های فراوان به پروسس مقصد اطلاع رسانی می نماید فلان دلیل همان شماره سیگنال است که به پروسس ارسال می گردد و پروسس مقصد می تواند سیگنال را ندیده گرفته و به فعالیت خودش ادامه دهد.

نکته مهم: هیچگاه به پروسس هایی که مشغول نوشتن  برروی فایل هستند و مخصوصاً پایگاه های داده، سیگنال ۹ نفرستید که این سیگنال پدر پروسس را در می آورد. و اصطلاحاً گوش پروسس را گرفته و آنرا بیرون می اندازد و خدا می داند که احتمالا چه بلایی به سر پایگاه داده در خواهد آمد.

در هر حال، روش های زیادی برای خارج نمودن یک پروسس از حافظه وجود دارد که در زیر به توضیحاتی مختصر در این باره خواهیم پرداخت.

در خاتمه توصیه می گردد که با فرمان  man نیم نگاهی بدستورات signal , kill بیاندازید( man 2 kill ) و ( man 7 signal ). همچنین می توانید برای مشاهده لیست سیگنال ها از دستور ( kill –l ) استفاده نمایید.
از دستور kill بمنظور ارسال یک سیگنال به پروسس و یا از بین بردن آن استفاده می شود. بطور معمول در صورت دانستن PID پروسس از دستور kill بصورت kill –SIGNAL PID استفاده می شود. همچنین راه های مختلفی جهت kill نمودن پروسس وجود دارد بعنوان مثال kill نمودن به واسطه نام پروسس، kill نمودن به واسطه قسمتی از نام پروسس، kill نمودن به واسطه نشان گر موس در محیط گرافیکی سیستم عامل لینوکس و …
در این راهنما به چهار روش جهت kill نمودن پروسس پرداخته خواهد شد.

دستور kill – از بین بردن و یا به اصطلاح کشتن یک پروسس بوسیله PID
دستور kill  جهت ازبین بردن یک پروسس به واسطه PID آن مورد استفاده قرار می گیرد.

در تمام مثال های زیر در رابطه با دستور kill یک سیگنال پایان دهی ( Termination ) به پروسس مشخصی فرستاده می شود. تمامی این سیگنالها را می توان یا از طریق نام آنها و یا از طریق شماره آنها مورد استفاده قرار داد. همچنین شما میباسیت PID پروسس مربوطه را برای این فرایند بدست آورید و از آن بعنوان یک استدلال برای دستور kill بهره گیرید.

1
2
3
$ kill -TERM pid
$ kill -SIGTERM pid
$ kill -15 pid

در زیر یک نمونه مثال برای kill نمودن پروسس firefox آورده شده است.

1
2
3
$ ps -ef | grep firefox
1986 ? Sl 7:22 /usr/lib/firefox-3.5.3/firefox
$ kill -9 1986

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

به مثال زیر دقت کنید:

1
2
3
4
5
6
7
8
9
10
11
12
$ ps -A | grep httpd
1445 ?         00:01:00 httpd
15961 ?        00:00:00 httpd
15962 ?        00:00:00 httpd
15963 ?        00:00:00 httpd
15964 ?        00:00:00 httpd
15965 ?        00:00:00 httpd
15966 ?        00:00:00 httpd
15967 ?        00:00:00 httpd
15968 ?        00:00:00 httpd

$ killall -9 httpd

دستور pkill – از بین بردن و یا به اصطلاح کشتن یک پروسس بوسیله نام آن پروسس
شما می توانید از طریق مشخص نمودن نام کامل یا قسمتی از نام یک پروسس با استفاده از دستور pkill اقدام به ارسال سیگنال نمایید. لذا برای استفاده از این دستور نیازی به پیدا نمودن PID پروسس برای ارسال سیگنال به آن نمی باشد، در مثال زیر سیگنال پایان دهی ( Termination ) را برای همه پروسس هایی که در نام آنها کلمه sample وجود دارد می فرستیم.

1
$ pkill sample

مثالی در رابطه با دستورpkill:
قبل از فرستادن یک سیگنال در صورت ندانستن PIDو نام صحیح یک پروسس، به واسطه دستور pgrep می توانید به جستجوی نام کامل و PID یک پروسس و پروسس های وابسته بپردازید و ببینید که کدام PID متعلق به کدام پروسس می باشد.

1
2
3
4
5
6
7
$ pgrep -l sample
12406 sample-server.p
12425 sample-server.p
12430 sample-garbagec

$ pkill -USR1 sample
$ pkill -9 sample

دستور xkill – از بین بردن و یا به اصطلاح کشتن یک پروسس از طریق رابط گرافیکی
دستور xkill یکی از ساده ترین راه ها به جهت از بین بردن برنامه هایی که بصورت ناقص به اجرا درآمده اند می باشد. هنگامی که شما می خواهید یک پروسس را در محیط گرافیکی ازبین ببرید xkill می تواند به واسطه مکان نمای انتخابی امکان kill کردن آن پروسس را به واسطه کلیک نمودن مکان نمای ماوس بر روی آن فراهم آورد. به نوعی می توان گفت این دستور جایگزین Ctrl+Alt+Delete در لینوکس می باشد.
با اجرای دستور xkill در ترمینال یا در بخش اجرای دستورات (Alt+F2) نشانگر ماوس به شکل یک ضربدر در آمده و هر پنجره ای که روی آن کلیک کنید را ریشه کن می کند.
اگر می خواهید راحت تر این کار را انجام دهید و نخواهید که دستوری برای این کار وارد کنید باید برای این دستور یک کلید میانبر تعریف کنید تا هروقت مثلا Ctrl+Alt+Shift را زدید این دستور به کار افتاده و هر پنجره ای که روی آن کلیک کنید را منهدم کند.

1
$ xkill

معرفی چند سیگنال کاربردی

  • SIGTERM 15

سیگنال پایان دهی ۱۵ را میتوان بطور پیشفرض توسط یکی از فرامین بالا مانند killall به پروسس مد نظر فرستاد. این اگرچه ارسال این سیگنال به یک پروسس سبب پایان دهی آن می شود اما برخلاف سیگنال SIGKILL می توان آن را به تعویق انداخته و یا نادیده گرفت. بنابراین SIGTERM به معنی یک درخواست محترمانه از پروسسی مانند mysql می باشد که به آن می گوید هر وقت کار شما به اتمام رسیده لطفآ خارج شوید. به همین دلیل در بسیاری از سیستم های یونیکسی در هنگام خاموش شدن ابتدا سیگنال SIGTERM به پروسس هایی که باید به کار آنها پایان داده شود فرستاده خواهد شد و بعد از  چند ثانیه انتظار سپس به پروسس های باقی مانده به زور سیگنال SIGKILL فرستاده خواهد شد.

  • SIGSTOP   ۱۷,۱۹,۲۳  –   SIGCONT   ۱۹,۱۸,۲۵

زمانی که SIGSTOP به یک پروسس فرستاده می شود موجب توقف روند معمول در وضعیت فعلی آن فرایند می شود و فقط در صورتی می تواند به کار خود ادامه دهد که سیگنال SIGCONT به همان پروسس ارسال شود. بعنوان مثال گاهی اوقات در حال کامپایل یک برنامه از طرف مدیر یک کار فورس ماژور به شما محول می شود و نیاز می باشد تا پروسس کامپایل را غیر فعال کنید تا بتوانید از منابع سیستمی بیشتری جهت انجام آن کار استفاده نمایید و بعد از اتمام کار، پروسس کامپایل را که تا نصف انجام شده بود را ادامه دهید و مراحل را از سر نگیرید. در این صورت می توانید با استفاده از SIGSTOP در همان لحضه پروسس را موقتاً STOP نمایید و بعد از انجام کار محول شده از سمت مدیر، پروسس کامپایل را جهت ادامه کار با ارسال سیگنال SIGCONT به آن ادامه دهید. به مثال زیر توجه کنید.

1
2
3
4
5
6
7
8
9
10
11
12
$ ps aufx | grep cron
root      1303  0.0  0.0  19116  1032 ?        Ss   08:14   0:00 cron

$ killall -SIGSTOP cron

$ ps aufx | grep cron
root      1303  0.0  0.0  19116  1032 ?        Ts   08:14   0:00 cron

$ kill -SIGCONT cron

$ ps aufx | grep cron
root      1303  0.0  0.0  19116  1032 ?        Ss   08:14   0:00 cron

7 دیدگاه برای این نوشته:

  1. امین فیض‌پور:
    ۱۸ آذر ۱۳۹۲ سلام
    بابت مطلب خوبتون تشکر می‌کنم، با بیان خوب و سر راستی نوشته شده بود.
    خسته نباشید.
  2. محمد:
    ۱۸ آذر ۱۳۹۲ البته خیلی هم مهربون نیستا! :دیhttp://upcity.ir/images2/81397124044965471050.png
  3. کاربر تازه وارد:
    ۱۸ آذر ۱۳۹۲ برای متوقف کردن یک پروسه به مانند فشردن Ctrl + C با دستور killall از سیگنال دو استفاده میشود به اینصورت : killall -s 2 ، عدد را به انگلیسی وارد کنید.
  4. حمزه خسروی:
    ۱۹ آذر ۱۳۹۲ خواهش می کنم امین جان
  5. hadi:
    ۱۹ آذر ۱۳۹۲ فکر کنم همه اینجا از من باتجربه تر اند ولی تو کی دی ای و احتمالا بقیه ی میز کار ها اگه فقط یه برنامه هنگ کنه و میز کار هنگ نکنه
    راحت تو قسمت سرچ برنامه ها تایپ کنید monitor
    یه برنامه می یاد که اسمش مانیتور هم نیست و یه چیز دیگست زیرش نوشته سیستم مانیتور اونو بزنید و بد رو هر برنامه ای خواستین کلیک سمت راست بزنید بد send signal وبد kill گرافیکی و راحت
    برای تازه کارها بهتره
  6. گنو حسین:
    ۱۹ آذر ۱۳۹۲ ممنون
    خیلی خوب و کاربردی بود
    همیشه برام سوال بود این سیگنالا دقیقا چیکار می کنن اما لامصصب اصلا حسش نمیومد برم help شو بخونم. فقط اینو می دونستم برای ترکوندن یه پروسه از سیگنال ۹ میشه استفاده کرد. یعنی این سیگنال می ترکونه هاااا. رسما نابود می کنه :)
  7. کاربر تازه وارد:
    ۲۱ آذر ۱۳۹۲ در میزکار KDE روش سریعتر و راحتترش اینه که کلیدهای Ctrl + Esc را فشار دهید و سپس از پنجره ی باز شده که پروسه ها را نشان میدهد با راست کلیک روی پروسه مورد نظر سیگنالی ارسال و یا آپشن مورد نظر را انتخاب کنید.

ارسال نظر سریع



برچسب ها : , , ,