টার্মিনালটি বন্ধ না করে টার্মিনালে চলমান স্ক্রিপ্টকে কীভাবে হত্যা করবেন (Ctrl + C কাজ করে না)?


36

আমি একটি বাশ স্ক্রিপ্ট লিখেছি যা অন্যান্য বেশ কয়েকটি প্রোগ্রামকে কল করে এবং প্রচুর কমান্ড কার্যকর করে। আমি এই স্ক্রিপ্টটি টার্মিনাল থেকে চালাচ্ছি। এখন আমি স্ক্রিপ্টটি মেরে ফেলতে চাই।

Ctrl + Cকখনও কখনও টিপলে এটি কেটে যায় না, আমি মনে করি কারণ কখনও কখনও স্ক্রিপ্ট অন্য প্রোগ্রাম চালায় এবং কোনও কারণে কিল সংকেতটি কাজ করে না।

তবে, আমি যদি টার্মিনাল উইন্ডোটি বন্ধ করি তবে এটি স্ক্রিপ্টটিকে মেরে ফেলবে।

আমি কি কিছু করতে পারি (কিবোর্ড সংমিশ্রণ), এটি টার্মিনাল উইন্ডোটি বন্ধ না করেই টার্মিনাল উইন্ডোটি বন্ধ করার অনুরূপ (আমি কমান্ডের ইতিহাস, বর্তমান ডিরেক্টরি, আউটপুট ইতিহাস ইত্যাদি হারাতে চাই না)?


8
এই জাতীয় ক্ষেত্রে আমি চেষ্টা করিCtrl + z
কেনে

এবং Ctrl + zরান করার পরে :kill -9 $(pgrep -f your_script.sh)
নোয়াম মানস

উত্তর:


38

আপনার কাছে কয়েকটি বিকল্প রয়েছে। একটি হ'ল স্ক্রিপ্ট ( CtrlZ) থামানো, স্ক্রিপ্টের পিআইডি পেয়ে SIGKILLপ্রক্রিয়া গ্রুপে প্রেরণ করা।

শেলটিতে একটি কমান্ড কার্যকর করা হলে, প্রক্রিয়াটি শুরু হয় এবং এর সমস্ত শিশুরা একই প্রক্রিয়া গোষ্ঠীর অংশ হয় (এই ক্ষেত্রে, অগ্রভাগের প্রক্রিয়া গ্রুপ)। এই গোষ্ঠীর সমস্ত প্রক্রিয়াতে একটি সংকেত প্রেরণ করতে, আপনি এটি প্রক্রিয়া নেতার কাছে প্রেরণ করেন। জন্য killকমান্ড, প্রক্রিয়া নেতা এইভাবে প্রকাশ হয়:

kill -PID

PIDস্ক্রিপ্টের প্রক্রিয়া আইডি কোথায় ।

উদাহরণ:

একটি স্ক্রিপ্ট বিবেচনা করুন test.shযা কিছু প্রক্রিয়া আরম্ভ করে। বলুন আপনি এটি খোলসে চালিয়েছেন:

$ ./test.sh

অন্য টার্মিনালে,

$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
                                                                               ├─sleep(17805)
                                                                               └─yes(17803)

এই ক্ষেত্রে, তৈরি করা গোষ্ঠীটি প্রক্রিয়া করার জন্য একটি সংকেত প্রেরণ করতে test.sh, আপনি যা করতে চাইবেন:

kill -INT -17802

-INTপ্রেরণ করতে ব্যবহৃত হয় SIGINT, এবং তাই এই কমান্ডটি CtrlCটার্মিনালে টিপানোর সমতুল্য । পাঠাতে SIGKILL:

kill -KILL -17802

আপনি কেবল অন্য স্ক্রিনটি খুলতে না পারলে স্ক্রিপ্টটি থামাতে হবে stop আপনি যদি পারেন pgrepতবে পিআইডি সন্ধান করতে ব্যবহার করুন ।

স্ক্রিপ্টটি আরম্ভ করে এমন একটি কমান্ড আটকে থাকতে পারে SIGINT, সম্ভবত CtrlCএটিই অকার্যকর। তবে, SIGKILLআটকা যায় না এবং এটি সাধারণত সর্বশেষ-রিসোর্ট বিকল্প। হত্যার আগে আপনি SIGTERM( -TERM) চেষ্টা করতে পারেন । না হয় SIGKILLবা উপায় SIGTERMহিসাবে কীবোর্ড শর্টকাট হিসাবে সেট আপ করা SIGINTযায় না।

যদি আপনার স্ক্রিপ্টে শেবাং লাইন না থাকে তবে এই সমস্ত কিছুই মুড। থেকে এই তাই উত্তর :

সাধারণত পিতামাত শেল অনুমান করে যে স্ক্রিপ্ট একই শেলের জন্য লেখা হয়েছে (ন্যূনতম বোর্নের মতো শেলগুলি / বিন / শ দিয়ে স্ক্রিপ্টটি চালায়, বাশ এটিকে বাশ সাবপ্রসেস হিসাবে চালায়) ...

এ কারণে, যখন স্ক্রিপ্টটি কার্যকর করা হয়, আপনি স্ক্রিপ্টের নামে একটি প্রক্রিয়া পাবেন না (বা কমান্ড লাইনে স্ক্রিপ্টের নাম সহ একটি প্রক্রিয়া) এবং pgrepব্যর্থ হবেন।

সর্বদা একটি শেবাং লাইন ব্যবহার করুন।


এর জন্য কিবোর্ডের সংমিশ্রণ রয়েছে SIGKILLনাকি SIGTERM?
বেকো

@ বেকো নো, এবং আপনি একটি সেট আপ করতে পারবেন না: superuser.com/a/417991/334516
মুরু

pgrep test.shআমার জন্য পিআইডি ফিরিয়ে দেয় না আমি একটি সহজ test.sh চেষ্টা: for i in {1..30}; do sleep 1 echo $i done যদিও test.shচলমান, আমি চালানো pgrep test.shআরেকটি টার্মিনালে, কিন্তু কিছুই ফিরিয়ে দেওয়া হয়। কোনো সমস্যা?
বেকো

1
@ বেকো আপনি কীভাবে স্ক্রিপ্টটি চালিয়েছেন? চেষ্টাও করুন pgrep -f test.sh
মুরু

pgrep -f test.shকাজ করে না। আমি স্ক্রিপ্টটি ./test.sh
চালাচ্ছি

6

আপনি যদি স্ক্রিপ্টের সাথে সম্পর্কিত এমন প্রক্রিয়াগুলি জানেন তবে আপনি তাদের পিআইডি ব্যবহার করে খুঁজে পেতে পারেন

 ps -A

এবং তারপরে পিআইডি নম্বরটি ব্যবহার করে সংশ্লিষ্ট প্রক্রিয়াগুলি মেরে ফেলুন

 kill -9 PID_Number

1
এটা খুব জটিল। স্ক্রিপ্টটি বেশ কয়েকটি অন্যান্য প্রোগ্রাম তৈরি করে এবং এই প্রোগ্রামগুলি সমান্তরাল প্রক্রিয়াগুলিকেও স্প্যান করে। এই সমস্ত প্রক্রিয়াটির উপর নজর রাখা খুব কঠিন। একটি সহজ সমাধান থাকতে হবে, যখন আপনি টার্মিনাল উইন্ডোটি বন্ধ করবেন তখন যা ঘটেছিল তার সাথে সাদৃশ্যপূর্ণ কিছু।
বেকো

আপনি কি pkill -P try চেষ্টা করতে পারেন
হ্যারিস

1

যেমন হ্যারিস বলেছিলেন আপনি চালাতে পারেন Kill -9 PID_Numberতবে আপনি htopএকটি ইন্টারেক্টিভ প্রক্রিয়া ব্রাউজার হিসাবে পরিচিত প্যাকেজটি ইনস্টল করতে পারেন যা নির্দিষ্ট প্রক্রিয়াগুলি অনুসন্ধান করা আরও সহজ করে তোলে। হটোপ হত্যার প্রক্রিয়াগুলিকে সমর্থন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.