زمانی که برنامهای در یکی از توزیعات لینوکس هنگ میکند و به درستی کار نمیکند، احتمالاً بستن آن با روش گرافیکی و ساده، غیرممکن میشود. در این صورت باید مثل ویندوز و مکاواس، پردازش مربوط به آن را به صورت اجباری بست. در غیر این صورت ممکن است درصد بالایی از توان پردازشی CPU را به خود اختصاص بدهد و مقدار زیادی RAM اشغال کند.
برای بستن اجباری پردازشها در لینوکس، چند فرمان ساده مثل kill و pkill و killall وجود دارد که هر یک کاربرد خاص خود را دارد. در این مقاله با این دستورات و مثالهایی از شیوهی استفاده، در خدمت علاقهمندان به Linux هستیم.
پردازش در لینوکس چیست؟
زمانی که برنامهای را اجرا میکنید و در محیط گرافیکی آن مشغول کار میشوید، در حقیقت تعداد زیادی پردازش و دستور در حال اجراست. در حالت کلی پردازشها در سیستم عامل Linux و همینطور ویندوز و مکاواس، به دو دسته تقسیم میشوند:
- پردازشهای پیشزمینه که کاربر آنها را اجرا کرده است. البته ممکن است اجرا کردن یک اپلیکیشن گرافیکی، موجب آغاز به کار این پردازشها شده باشد و مستقیماً دستور یا پردازشی اجرا نشده باشد.
- پردازشهای پسزمینه یا بکگراند که به صورت خودکار شروع به کار میکنند و کاربر مستقیماً یا به صورت غیرمستقیم آنها را اجرا نکرده است. این پردازشها برای فراهم کردن سرویسهایی در سیستم عامل، در پشت صحنه مشغول به کار میشوند.
زمانی که برنامهای کرش و هنگ میکند، قابلیت بستن آن با کلیک روی دکمهی بستن وجود ندارد و به همین جهت است که گاهی باید از طریق ترمینال، دستورات مربوط به بستن اجباری را اجرا کرد تا برنامه بالاجبار بسته شود.
به یک نکتهی مهم توجه کنید:
ممکن است به اپلیکیشن هنگ کرده نیازی نداشته باشید و بخواهید پس از ریاستارت کردن کامپیوتر، آن را از نو اجرا کنید اما به هر حال بستن اجباری مفید است چرا که نمیگذارد پردازشهای مربوط به یک برنامه، شدیداً از پردازنده و رم، کارت گرافیک و حتی هارددیسک سیستم شما استفاده کنند و فرآیندی را به شکل ناقص، مرتباً تکرار کنند.
منظور از Killing یا کشتن در لینوکس، بستن اجباری پردازشها است که با چند دستور ساده و کاربردی انجام میشود. در ادامه با شیوهی استفاده از kill و pkill و killall آشنا میشویم.
بستن اجباری پردازش با دستور kill در لینوکس
برای استفاده از دستور kill، میبایست پس از این دستور، شناسهی پردازش و به عبارت دیگر PID آن را تایپ کنید. برای چک کردن لیست پردازشها و نمایش شناسهی هر یک از پردازشها، میتوانید از دستور ps استفاده کنید.
فرمان ps سوییچی به اسم -e دارد که موجب لیست شدن تمام پردازشها میشود. برای راحتتر چک کردن لیست پردازشها، میتوانید پس از این دستور، دستور less را اضافه کنید. بنابراین فرمان زیر را در اپلیکیشن ترمینال لینوکس تایپ کنید:
با زدن کلید Enter، لیست پردازشها نمایان میشود. در ستون اول، PID یا Process ID که شناسهی پردازش است، ذکر میشود. اکنون میتوانید با فشار دادن کلید / صفحات بعدی را ببینید و با زدن ? صفحات قبلی را مشاهده کنید.
روش سریعتر برای یافتن شناسهی پردازش، این است که با دستور grep در لیستی که با فرمان ps -e ساخته شده، جستجو انجام بدهید. کافی است پس از این دستور، از | و سپس دستور grep و در نهایت بخشی از نام برنامه یا پردازش استفاده کنید. به عنوان مثال برای یافتن برنامهای که کلمهی Shutter در نام آن به کار رفته، از دستور زیر استفاده کنید:
پس از یافتن شناسهی پردازش، کافی است فرمان kill و شمارهی پردازش را وارد کنید و Enter را فشار دهید تا پردازش موردنظر بسته شود.
این فرمان نتیجهای به عنوان خروجی نمایش نمیدهد و در واقع بدون سروصدا، پردازش را میبندد.
کار با دستور pkill در Linux
فرمان pkill هم برای بستن اجباری پردازشها به کار میرود اما نیازی به شناسه یا PID نیست بلکه میبایست نام پردازش را پس از این دستور تایپ کنید. البته باید نام پردازش را صحیح تایپ کنید تا پردازشی با نام مشابه، به اشتباه بسته نشود! نکتهی مهم این است که pkill هر پردازشی که بخشی از نام آن را تایپ کرده باشید هم میبندد! برای جلوگیری از این رفتار، میبایست نامها را جستجو کنید و نام کامل را تایپ کنید.
برای اطمینان بیشتر میتوانید از دستور pgrep برای جستجو کردن نام پردازشها و برگرداندن شناسه استفاده کنید. طبعاً اگر نام پردازشی را اشتباه تایپ کرده باشید، نتیجهی جستجو این اشتباه تایپی را روشن میکند.
به عنوان مثال فرض کنید که میخواهید پردازشی با عبارت subq در نام آن را به صورت اجباری ببندید. با اجرا کردن فرمان ps و استفاده از grep، میتوان مطمئن شد که تنها یک پردازش با عبارت subq در نام آن وجود دارد و البته نام کامل پردازش نیز ذکر میشود. در این مثال، dave نام حساب کاربری است:
اکنون دستور زیر را اجرا کنید تا روشن شود که تنها یک پردازش با کلمهی subq در نام آن وجود دارد و سپس با دستور pkill پردازش موردبحث را ببندید:
همانطور که در ابتدا اشاره کردیم، pkill هر پردازشی که بخشی از نام آن با عبارت وارد شده یکی باشد را میبندد. به عنوان مثال:
برای بستن چند پردازش در یک مرحله هم میتوانید از دستور pkill استفاده کنید. به عنوان مثال مرورگر کروم را در نظر بگیرید، این مرورگر چند پردازش اجرا میکند. با اجرا کردن دستور زیر، این پردازشها لیست میشود:
و با اجرای دستور بعدی، همهی پردازشها بسته میشوند:
در نهایت میتوانید دستور اول را مجدداً اجرا کنید و بررسی کنید که آیا پردازشی با کلمهی Chrome در حال اجراست یا خیر:
اما حالت دیگر این است که چند پردازش تشابه اسمی دارند و نمیخواهید همه را ببندید. در این صورت میتوانید فرمان pgrep را با سوییچ -f اجرا کنید تا تفاوتها روشن شود. به عنوان مثال اگر بخواهید فرمان ping خاصی را ببندید، میتوانید نام کامل آن را بین دو دابلکوتیشن که همان " است، قرار بدهید و در مورد این پردازش خاص جستجو کنید و در ادامه با فرمان pkill آن را ببندید:
بستن همهی پردازشهای یکسان با killall
استفاده از kill و pkill زمانی خوب است که پردازشهای موردنظر چند مورد خاص و غیرتکراری باشد. اگر پردازشی داشته باشید که در زمانهای مختلف به صورت مجزا و چندین مرتبه اجرا شده، برای بستن همهی موارد آن بهتر است از دستور killall استفاده کنید. البته فرمان killall در برخی توزیعات لینوکس، برای بستن همهی پردازشها کاربرد دارد و اجرا کردن آن خطرناک است.
در سیستم عامل Solaris و OpenIndiana با اجرای دستور killall، تمام پردازشهای مربوط به حساب کاربری فعلی بسته میشود! اگر در حساب روت این دستور را اجرا کنید، فرمان sudo killall اجرا شده و موجب ریبوت شدن کامپیوتر لینوکسی میشود.
دستور killall مشابه pkill است با این تفاوت که لازم است نام پردازش را به صورت کامل وارد کنید. به عنوان مثال دستور زیر موجب بسته شدن پردازشی به اسم shutter نمیشود در حالیکه مورد بعدی این کار را انجام میدهد:
همانطور که در تصویر زیر مشاهده میکنید، نتیجهی اجرای دستور اول، پیغام no process found یا پیدا نکردن پردازش است.
یکی از سوییچهای مفید killall، سوییچ -y یا Younger Than است که پردازشهایی که عمرشان کمتر از مقدار مشخص شده باشد را میبندد. عمر را میتوانید با وارد کردن حروف S و m و M و H و غیره وارد کنید.
- s مخفف seconds یا ثانیهها
- m مخفف minutes یا دقایق
- h مخفف hours یا ساعتها
- d مخفف days یا روزها
- w مخفف weeks یا هفتهها
- M مخفف months یا ماهها
- y مخفف years یا سالها
به عنوان مثال برای بستن چند فرآیند پردازشی به اسم ana که برخی اخیرا اجرا شدهاند، میتوانید از دستور زیر استفاده کنید: که تمام موارد مربوط به ۲ دقیقهی اخیر را به صورت اجباری میبندد و موارد قدیمی را باز نگه میدارد:
سوییچ مشابه، سوییچ -o یا Older Than است که پردازشهای قدیمیتر از بازهی زمانی مشخص شده را میبندد.
howtogeekسیارهی آیتی