kill - فرستادن سیگنال به پروسس

هر پروسسی که در سیستم شما در حال اجرا هست در حال گوش دادن برای دریافت سیگنال از طرف کاربر یا کرنل هست. این سیگنال‌ها هر کدوم یک عدد هستن و معنی‌های خاصی دارن که توسط پروسس‌ها شناخته شده هستن.

برای مثال فرض کنید که یک برنامه رو از طریق ترمینال اجرا کردین و این برنامه هنگ کرده. معمولا در این مواقع کلید ترکیبی ctrl+c رو می‌زنین. در واقع این کلید ترکیبی سیگنال SIGINT (به معنی قطع کردن، استوپ کردن پروسس در حال اجرا) رو می‌فرسته به پروسس.

نکته: استوپ کردن در اینجا به معنی اون استوپی که میشه دوباره پروسس رو resume کرد نیست اون مال سیگنال دیگری هست.

لیست سیگنال‌هارو می‌تونین از فایل ببینین:

/usr/include/x86_64-linux-gnu/bits/signum.h

ممکنه این فایل جاش برای شما فرق بکنه که برای پیدا کردنش می‌تونین این دستور رو بزنین:

در صفحه man دستور kill هم لیستی از سیگنال‌ها هست و با زدن دستور kill -l هم لیست سیگنال‌ها رو می‌نویسه. جلوتر در مورد این آپشن توضیح داده شده.

aliabry@lp:~$ locate signum.h
/usr/include/x86_64-linux-gnu/bits/signum.h

معنی بعضی از سیگنال‌ها:

1:HUB، این سیگنال (Hang up) به صورت خودکار وقتی logout می‌کنین یا یک مودم رو دیس‌کانکت می‌کنین فرستاده می‌شود. همچنین این سیگنال برای از نو خواندن فایل کانفیگ هم استفاده می‌شود. فرض کنین که یک http سرور دارین و می‌خواین که بدون ریستارت کردن این سرویس بهش بگین که فایل کانفیگ رو بخونه خوب می‌تونین از این سیگنال استفاده کنین.

2:INT، این سیگنال به معنی قطع کردن یک پروسس در حال اجرا هست، وقتی ctrl+c رو می‌زنین این سیگنال فرستاده می‌شود.

20:TSTP، این سیگنال برای استوپ کردن یک پروسس در حال اجرا استفاده می‌شود به صورتی که اون پروسس آماده انجام ادامه کارش هست. یعنی ریستارت یا از نو شروع نمی‌کنه. وقتی کلید ترکیبی ctrl+z رو می‌زنین این سیگنال فرستاده می‌شود. برای اطلاعات بیشتر در مورد «Shell Job Control» یا دستور fg ،bg ،jobs جستجو کنین.

18:CONT، از این سیگنال وقتی استفاده می‌شود که یک پروسس توسط SIGTSTP یا SIGSTOP استوپ شده باشد. وقتی از دستور fg یا bg استفاده می‌کنین این سیگنال فرستاده می‌شود.

15:TERM، وقتی این سیگنال رو می‌فرستیم پروسس مربوطه اگر امکانش باشد از بین می‌رود. سیگنال از پروسس می‌خواد که هر وقت پروسسش تموم شد و با فایل‌هایی که کار می‌کرد کارش تموم شد بسته بشه. این سیگنال سیگنال پیش فرض دستور Kill هم هست.

9:KILL، اسم انگلیسیش گویای کاریه که انجام می‌ده. این سیگنال بدون هیچ ملاحظه‌ای پروسس رو از بین می‌بره. فکر می‌کنم این سیگنال پرمصرف‌ترین سیگنال باشه.

دیدن نام سیگنال یک عدد به‌وسیله l-و برعکس

اگر این آپشن رو به تنهایی بزنین لیست تمام سیگنال‌های قابل قبول رو می‌نویسه، مثلا برای سیستم من:

aliabry@lp:/$ kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

و اگر اسم یک سیگنال رو خواستیم:

در زیر اسم سیگنال ۱۵ رو می‌بینیم:

aliabry@lp:/$ kill -l 15
TERM

در زیر عدد سیگنال TERM رو می‌بینیم:

aliabry@lp:/$ kill -l TERM
15

آپشن s-

این آپشن برای تعیین سیگنال استفاده می‌شود. مثلا به مثال‌های زیر نگاه کنین همه یک معنی رو می‌دن و همه سیگنال TERM یا سیگنال شماره 15 رو به پروسس 19568 می‌فرستن:

نام سیگنال‌تون رو بعد از sig-بنویسین.

kill -sigTERM 19568

kill -sigterm 19568

kill -term 19568

kill -TERM 19568

kill -s 15 19568

استفاده از نوع عددی سیگنال

برای تعیین نوع عددی سیگنال اون عدد رو به همراه -به کار ببرین. مثلا در زیر سیگنال شماره ۹ که قوی‌ترین سیگنال برای از بین بردن یک پروسس هست رو به دو pid می‌فرستیم.

aliabry@lp:/$ sudo kill -9 19636 19692