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

برای بستن اجباری پردازش‌ها در لینوکس، چند فرمان ساده مثل kill و pkill و killall وجود دارد که هر یک کاربرد خاص خود را دارد. در این مقاله با این دستورات و مثال‌هایی از شیوه‌ی استفاده، در خدمت علاقه‌مندان به Linux‌ هستیم.

پردازش در لینوکس چیست؟

زمانی که برنامه‌ای را اجرا می‌کنید و در محیط گرافیکی آن مشغول کار می‌شوید، در حقیقت تعداد زیادی پردازش و دستور در حال اجراست. در حالت کلی پردازش‌ها در سیستم عامل Linux و همین‌طور ویندوز و مک‌او‌اس، به دو دسته تقسیم می‌شوند:

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

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

به یک نکته‌ی مهم توجه کنید:

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

منظور از Killing یا کشتن در لینوکس، بستن اجباری پردازش‌ها است که با چند دستور ساده و کاربردی انجام می‌شود. در ادامه با شیوه‌ی استفاده از kill و pkill و killall‌ آشنا می‌شویم.

بستن اجباری پردازش با دستور kill در لینوکس

برای استفاده از دستور kill، می‌بایست پس از این دستور، شناسه‌ی پردازش و به عبارت دیگر PID آن را تایپ کنید. برای چک کردن لیست پردازش‌ها و نمایش شناسه‌ی هر یک از پردازش‌ها، می‌توانید از دستور ps استفاده کنید.

فرمان ps سوییچی به اسم -e دارد که موجب لیست شدن تمام پردازش‌ها می‌شود. برای راحت‌تر چک کردن لیست پردازش‌ها، می‌توانید پس از این دستور، دستور less را اضافه کنید. بنابراین فرمان زیر را در اپلیکیشن ترمینال لینوکس تایپ کنید:

با زدن کلید Enter، لیست پردازش‌ها نمایان می‌شود. در ستون اول، PID یا Process ID که شناسه‌ی پردازش است، ذکر می‌شود. اکنون می‌توانید با فشار دادن کلید / صفحات بعدی را ببینید و با زدن ? صفحات قبلی را مشاهده کنید.

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

روش سریع‌تر برای یافتن شناسه‌ی پردازش، این است که با دستور grep در لیستی که با فرمان ps -e‌ ساخته شده، جستجو انجام بدهید. کافی است پس از این دستور، از | و سپس دستور grep و در نهایت بخشی از نام برنامه یا پردازش استفاده کنید. به عنوان مثال برای یافتن برنامه‌ای که کلمه‌ی Shutter‌ در نام آن به کار رفته، از دستور زیر استفاده کنید:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

پس از یافتن شناسه‌ی پردازش، کافی است فرمان kill و شماره‌ی پردازش را وارد کنید و Enter را فشار دهید تا پردازش موردنظر بسته شود.

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

این فرمان نتیجه‌ای به عنوان خروجی نمایش نمی‌دهد و در واقع بدون سروصدا، پردازش را می‌بندد.

کار با دستور pkill در Linux

فرمان pkill هم برای بستن اجباری پردازش‌ها به کار می‌رود اما نیازی به شناسه یا PID نیست بلکه می‌بایست نام پردازش را پس از این دستور تایپ کنید. البته باید نام پردازش را صحیح تایپ کنید تا پردازشی با نام مشابه، به اشتباه بسته نشود! نکته‌ی مهم این است که pkill‌ هر پردازشی که بخشی از نام آن را تایپ کرده باشید هم می‌بندد! برای جلوگیری از این رفتار، می‌بایست نام‌ها را جستجو کنید و نام کامل را تایپ کنید.

برای اطمینان بیشتر می‌توانید از دستور pgrep برای جستجو کردن نام پردازش‌ها و برگرداندن شناسه استفاده کنید. طبعاً اگر نام پردازشی را اشتباه تایپ کرده باشید، نتیجه‌ی جستجو این اشتباه تایپی را روشن می‌کند.

به عنوان مثال فرض کنید که می‌خواهید پردازشی با عبارت subq در نام آن را به صورت اجباری ببندید. با اجرا کردن فرمان ps و استفاده از grep، می‌توان مطمئن شد که تنها یک پردازش با عبارت subq در نام آن وجود دارد و البته نام کامل پردازش نیز ذکر می‌شود. در این مثال، dave نام حساب کاربری است:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

اکنون دستور زیر را اجرا کنید تا روشن شود که تنها یک پردازش با کلمه‌ی subq در نام آن وجود دارد و سپس با دستور pkill پردازش موردبحث را ببندید:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

همان‌طور که در ابتدا اشاره کردیم، pkill هر پردازشی که بخشی از نام آن با عبارت وارد شده یکی باشد را می‌بندد. به عنوان مثال:

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

و با اجرای دستور بعدی، همه‌ی پردازش‌ها بسته می‌شوند:

در نهایت می‌توانید دستور اول را مجدداً اجرا کنید و بررسی کنید که آیا پردازشی با کلمه‌ی Chrome در حال اجراست یا خیر:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

اما حالت دیگر این است که چند پردازش تشابه اسمی دارند و نمی‌خواهید همه را ببندید. در این صورت می‌توانید فرمان pgrep را با سوییچ -f اجرا کنید تا تفاوت‌ها روشن شود. به عنوان مثال اگر بخواهید فرمان ping خاصی را ببندید، می‌توانید نام کامل آن را بین دو دابل‌کوتیشن که همان "‌ است، قرار بدهید و در مورد این پردازش خاص جستجو کنید و در ادامه با فرمان pkill آن را ببندید:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

بستن همه‌ی پردازش‌های یکسان با killall

استفاده از kill‌ و pkill زمانی خوب است که پردازش‌های موردنظر چند مورد خاص و غیرتکراری باشد. اگر پردازشی داشته باشید که در زمان‌های مختلف به صورت مجزا و چندین مرتبه اجرا شده، برای بستن همه‌ی موارد آن بهتر است از دستور killall استفاده کنید. البته فرمان killall در برخی توزیعات لینوکس، برای بستن همه‌ی پردازش‌ها کاربرد دارد و اجرا کردن آن خطرناک است.

در سیستم عامل Solaris و OpenIndiana با اجرای دستور killall، تمام پردازش‌های مربوط به حساب کاربری فعلی بسته می‌شود! اگر در حساب روت این دستور را اجرا کنید، فرمان sudo killall اجرا شده و موجب ریبوت شدن کامپیوتر لینوکسی می‌شود.

دستور killall مشابه pkill است با این تفاوت که لازم است نام پردازش را به صورت کامل وارد کنید. به عنوان مثال دستور زیر موجب بسته شدن پردازشی به اسم shutter نمی‌شود در حالیکه مورد بعدی این کار را انجام می‌دهد:

همان‌طور که در تصویر زیر مشاهده می‌کنید، نتیجه‌ی اجرای دستور اول، پیغام no process found‌ یا پیدا نکردن پردازش است.

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

یکی از سوییچ‌های مفید killall، سوییچ -y یا Younger Than است که پردازش‌هایی که عمرشان کمتر از مقدار مشخص شده باشد را می‌بندد. عمر را می‌توانید با وارد کردن حروف S و m و M و H و غیره وارد کنید.

  • s مخفف seconds یا ثانیه‌ها
  • m  مخفف minutes یا دقایق
  • h مخفف hours یا ساعت‌ها
  • d مخفف days یا روزها
  • w مخفف weeks یا هفته‌ها
  • M مخفف months یا ماه‌ها
  • y مخفف years یا سال‌ها

به عنوان مثال برای بستن چند فرآیند پردازشی به اسم ana که برخی اخیرا اجرا شده‌اند، می‌توانید از دستور زیر استفاده کنید: که تمام موارد مربوط به ۲ دقیقه‌ی اخیر را به صورت اجباری می‌بندد و موارد قدیمی را باز نگه می‌دارد:

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall

سوییچ مشابه، سوییچ -o یا Older Than است که پردازش‌های قدیمی‌تر از بازه‌ی زمانی مشخص شده را می‌بندد.

آموزش بستن اجباری پردازش‌های در لینوکس با kill و pkill و killall