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

چندین ابزار وجود دارد که به شما امکان می‌دهد، فرآیندهای نامناسب را با استفاده از دستور kill (یکی از رایج ترین دستورات) خاتمه دهید.

 

دستور kill

Kill یک دستور موجود در بیشتر پوسته‌های گرفته شده از Bourne مانند Bash و Zsh است. عملکرد این دستور بین پوسته‌ها و بصورت مستقل از طریق /bin/kill کمی متفاوت است.

می‌توانید از دستور type برای نمایش همه مکانهای سیستم‌تان که حاوی kill است، استفاده کنید:

$ type -a kill

در این صورت خروجی به صورت زیر نمایش داده می‌شود:

kill is a shell builtin
kill is /bin/kill

این خروجی نشان می‌دهد؛ که اجرای دستور موجود در پوسته نسبت به اجرای مستقل دارای اولویت است و هر زمان که دستور kill را وارد نمایید، از آن استفاده می‌شود. اگر می‌خواهید بصورت باینری از این دستور استفاده نمایید، باید مسیر کامل فایل /bin/kill را تایپ کنید. در این مقاله، از اجرای پوسته موجود Bash استفاده خواهیم کرد.

ساختار دستور kill به شکل زیر است:

kill [OPTIONS] [PID]...

دستور kill، یک سیگنال را به فرآیندهای مشخص یا به گروه‌هایی از فرآیندها می‌فرستد، و باعث می‌شود، آنها طبق سیگنال دریافت شده عمل کنند. زمانی که سیگنال مشخص نشده باشد، به صورت پیش فرض -15 یا –TERM در نظر گرفته می‌شود.

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

  • 1 یا HUP که یک فرآیند را مجددا بارگیری می‌نماید.
  • 9 یا  KILL که یک فرآیند را می‌کشد (بیشترین کاربرد را دارد).
  • 15 یا TERM که  با احتیاط یک فرآیند را متوقف می‌کند.

برای به دست آوردن لیستی از تمام سیگنالهای موجود، دستور kill با گزینه -l  فراخوانی کنید:

$ kill -l

سیگنال‌ها می‌توانند به سه روش مختلف مشخص شوند:

  1. با استفاده از شماره (به عنوان مثال، -1 یا -s 1)
  2. با استفاده از پیشوند "SIG" (مانند، -SIGHUP یا -s SIGHUP)
  3. بدون پیشوند "SIG" (مثلاً-HUP  یا -s HUP)

بنابراین دستورات زیر معادل یکدیگرند:

$ kill -1 PID_NUMBER
$ kill -SIGHUP PID_NUMBER
$ kill -HUP PID_NUMBER

PIDهای داده شده به دستور kill می‌تواند یکی از موارد زیر باشد:

اگر PID بزرگ تر از صفر باشد، سیگنال با شناسه برابر با PID به فرایند ارسال می‌گردد.

اگر PID برابر با صفر باشد، سیگنال به کلیه فرآیندهای موجود در گروه فرآیند ارسال می‌شود. به عبارت دیگر، سیگنال به کلیه فرآیندهای متعلق به GID پوسته فراخوانی شده در دستور kill ارسال می‌شود. برای مشاهده شناسه‌های گروه فرآیندها (GIDها) از دستور ps -efj استفاده کنید.

اگر PID برابر با -1 باشد، سیگنال به کلیه فرایندها با همان UID که کاربر دستور را با آن فراخوانی نموده است، ارسال می‌شود. اگر کاربر فراخوان، root باشد، سیگنال به کلیه فرایندها به جز init و خود فرآیند kill ارسال می‌شود.

اگر PID کمتر از -1 باشد، سیگنال به کلیه فرآیندهای موجود در گروه فرایندها با GID برابر با مقدار مطلق PID ارسال می‌گردد.

کاربران عادی تنها می‌توانند سیگنالهایی را برای فرآیندهای خود ارسال کنند، نه برای فرآیندهایی که به کاربران دیگر تعلق دارند، در حالی که کاربر root می‌تواند، سیگنالهایی را به فرآیندهای سایر کاربران نیز ارسال نماید.

 

این مطلب نیز ممکن است برای شما مفید باشد: دستور Which در لینوکس

 

خاتمه فرآیند با استفاده از دستور kill

برای خاتمه دادن یا کشتن یک فرآیند با دستور kill، ابتدا باید شماره شناسه فرآیند یعنی PID را پیدا کنید. این کار را می‌توان با استفاده از دستورات مختلف مانند top، ps، pidof و pgrep انجام داد.

فرض کنید اجرای مرورگر فایرفاکس با مشکل روبه رو شده است، و شما باید فرایند مربوط به فایرفاکس را بکشید. برای یافتنPID‌های مرورگر می‌توانید از دستور pidof به صورت زیر استفاده کنید:

$ pidof firefox

این دستور شناسه‌های کلیه فرآیندهای فایرفاکس را چاپ می‌کند:

6263 6199 6142 6076

پس از اینکه شماره فرآیندها را بدست آوردید، می‌توانید با ارسال سیگنال TERM همه آنها را خاتمه دهید:

$ kill -9 2551 2514 1963 1856 1771

به جای جستجوی PIDها و سپس خاتمه فرآیندها، می‌توانید دستورات فوق را بصورت یکجا نیز استفاده کنید:

$ kill -9 $(pidof firefox)

 

این مطلب نیز ممکن است برای شما مفید باشد: دستور Tail در لینوکس

 

بارگیری مجدد فرآیندها با استفاده از دستور kill

استفاده دیگر kill، ارسال سیگنال HUP است؛ که باعث بارگیری مجدد تنظیمات یک فرآِیند می‌شود.

به عنوان مثال، برای بارگیری مجدد Nginx، باید سیگنالی را به فرایند اصلی آن ارسال کنید. شناسه فرآیند اصلی Nginx را می‌توان در فایل nginx.pid یافت، که معمولا در دایرکتوری /var/ run قرار دارد.

برای پیدا کردن PID فرآیند اصلی از دستور cat استفاده کنید:

$ cat /var/run/nginx.pid

در این صورت خروجی به صورت زیر خواهد بود:

30251

پس از پیدا کردن PID فرآِیند اصلی، تنظیمات Nginx را با نوشتن دستور زیر مجددا بارگیری کنید:

$ sudo kill -1 30251

توجه داشته باشید که این دستور نیز باید توسط root یا کاربر دارای امتیازات sudo اجرا شود.

 

 

منبع:

linuxize