একটি কমান্ড দিয়ে চলমান প্রক্রিয়াটির অনেকগুলি দৃষ্টান্ত হত্যা করুন


75

ধরুন আমার কাছে কোনও প্রক্রিয়া (উদাহরণস্বরূপ vi) চলার এক হাজার বা তারও বেশি উদাহরণ রয়েছে । আমি কীভাবে একটি একক শট / এক লাইন কমান্ড / এক কমান্ডে তাদের সমস্তকে হত্যা করব?


3
আপনি কোন সিস্টেমে এটি কাজ করতে চান তা পরিষ্কার নয়। উদাহরণস্বরূপ, লিনাক্সে আমি প্যাকেজ pkillথেকে ব্যবহার করি procps
হরিণ হান্টার

প্রশ্নটি সাধারণ দৃষ্টিকোণ থেকে জিজ্ঞাসা করা হয়েছিল। আমি মাত্র দুটি প্রক্রিয়া কিলালের মতো এবং অ্যাডাব্লু / এসডের মাধ্যমে জানতাম। তবে আমি এটি অর্জনের অন্যান্য উপায় আছে কিনা তা জানতে চেয়েছিলাম। যদি এটি বিভিন্ন সিস্টেমে আলাদাভাবে করা হয়, তবে আমি জানতে চাই কোনটিতে। এটি গুগলের কাছে খুব জটিল, এর পরিবর্তে আমি আপনারা সমস্ত অভিজ্ঞ ছেলেদের সাথে আলোচনা করার কথা ভাবি।
দ্য ডার্ক নাইট

উত্তর:


97

ভাল পুরানো কি হয়েছে,

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

এটিকে আরও দক্ষ করার উপায় রয়েছে,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

এবং অন্যান্য বৈচিত্রগুলি, তবে প্রাথমিক স্তরে, এটি সর্বদা আমার পক্ষে কাজ করে।


1
ভোট দিয়েছে, কেবল প্রথম বৈচিত্রটিই জানত। দ্বিতীয়টি আরও দক্ষ দেখায়, আপনাকে ধন্যবাদ।
ডার্ক নাইট

5
@ দারডকাইটনাইট এই পদ্ধতির সমস্যাটি হ'ল আপনি প্রায়শই নিজের ইচ্ছার চেয়ে বেশি হত্যার চেষ্টা করেন। একটি নির্ভরযোগ্য "কিছু অনুসন্ধান" লেখা জটিল। লিনাক্সের অধীনে, পিকিল ব্যবহার করুন , যা বেশিরভাগ সূক্ষ্মতা পরিচালনা করে।
গিলস

আমি নিশ্চিত নই যে এটি খুব জটিল, যদি আপনি একটি নির্দিষ্ট বাইনারি পরে থাকেন তবে এটি বেশ নির্ভরযোগ্য হতে পারে। আমি এটিকে সর্বদা echo kill -9 $pidপ্রথম হিসাবে চালিত করি তাই আমি জানি যে আমি কী পাচ্ছি। আমি নিশ্চিত নই যে এআইএক্স আছে pkill, যা আমার রুটি এবং মাখন ইউএনআইএক্স। এবং নিচে ভোট দেওয়া - বিজোড় হওয়া কি আসলেই খারাপ।
এইটবিটনি

1
একেবারে প্রয়োজনীয় না হলে আপনার সিগকলের পরিবর্তে প্রসেসটি SIGTERM প্রেরণ করা উচিত।

আমার যুক্ত করা উচিত যে এই 2 টি পদ্ধতিগুলি সমস্ত শেলগুলিতে কাজ করবে না, উদাহরণস্বরূপ এটি কাজ করবে নাcsh
নন সিকিউটার

38

কিল্ল ব্যবহার করুন,

killall vi

এটি 'vi' নামের সমস্ত আদেশকে হত্যা করবে

আপনি সিগন্যালও যুক্ত করতে পারেন, উদাহরণস্বরূপ SIGKILL

killall -9 vi


এটা ঠিক, আপনি যে সিগন্যালটি চান তাও যোগ করতে পারেন, যেমনkillall -9 vi
Hola Soy Edu Feliz Navidad

1
আমি মনে করি না কিলাল এটির জন্য ন্যাসওয়ার: ফাইল দ্বারা হত্যা কেবলমাত্র মৃত্যুদন্ড কার্যকর করার সময় কার্যকর করে যা কার্যকর করার সময় উন্মুক্ত রাখা হয়, অর্থাৎ অপরিষ্কার এক্সিকিউটেবলকে এভাবে হত্যা করা যায় না। টাইপ করে কিল্লাল নামটি নন-লিনাক্স সিস্টেমগুলিতে পছন্দসই প্রভাব ফেলতে পারে না, বিশেষত কোনও সুবিধাযুক্ত ব্যবহারকারীর দ্বারা করা হলে hatআমি যদি কিছু নন-লিনাক্স প্রক্রিয়া প্রচুর উদাহরণ মুছতে চাইছি? কিল্ল-আমরা সনাক্ত করে না যে কোনও প্রক্রিয়া অদৃশ্য হয়ে গেছে এবং স্ক্যানের মধ্যে একই পিআইডি দিয়ে একটি নতুন প্রক্রিয়া প্রতিস্থাপন করা হয়েছে। যদি প্রক্রিয়াগুলি তাদের নাম পরিবর্তন করে, কিল্লাল তাদের সাথে সঠিকভাবে মেলে না।
দ্য ডার্ক নাইট

13
দয়া করে সচেতন হন যে এটি কেবল লিনাক্স এবং বিএসডি-তে কাজ করে। সোলারিস এবং অন্যান্য কিছু সিস্টেমে killallনামটি যা ঠিক বলে দেয় ঠিক তেমন করে ... এটি আর-ইন-প্রক্রিয়াটিকে মেরে ফেলে।
ববি

2
এআইএক্স-এ, "কিলাল প্রক্রিয়া উত্পাদনকারীদের ব্যতীত, আপনি শুরু করেছেন এমন সমস্ত প্রক্রিয়া বাতিল করে।"
এইটবিটনি

31

pkillআমি প্রস্তাবিত যা তা উপলব্ধ থাকে ( লিনাক্স , ফ্রিবিএসডি , নেটবিএসডি , ওপেনবিএসডি , সোলারিস )। সম্পূর্ণ কমান্ড লাইন বা অন্যান্য মানদণ্ডের মাধ্যমে আপনি কমান্ড নাম দ্বারা প্রক্রিয়াগুলি নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, pkill viসমস্ত প্রোগ্রামকে হত্যা করে যার কমান্ড নামটিতে স্ট্রিং থাকে vi। কেবলমাত্র প্রসেসগুলি হত্যা করতে vi, ব্যবহার করুন pkill -x viviশেষ হওয়া যুক্তি দিয়ে শেষ হওয়া প্রসেসগুলি কেবলমাত্র হত্যা করতে .confব্যবহার করুন pkill -fx 'vi.*\.conf'

পিআইডিগুলির তালিকা দেখতে যা pkillআপনাকে সিগন্যাল প্রেরণ করবে, ব্যবহার করবে pgrep, যার সিগন্যাল নাম বা নম্বর গ্রহণ করবে না তা বাদে ঠিক একই সিনট্যাক্স রয়েছে। এই প্রক্রিয়াগুলি সম্পর্কে আরও তথ্য দেখতে, চালান

ps -p "$(pgrep …)"

লিনাক্সের অধীনে, ps -p $(pgrep -d, …)এর পরিবর্তে আপনার প্রয়োজন (এটি একটি বাগ: লিনাক্স psপসিক্স-অনুগত নয়)।

প্রসেসগুলি হত্যা করার শনাক্ত করার আরেকটি সাধারণ উপায় হ'ল প্রক্রিয়াগুলির একটি নির্দিষ্ট ফাইল খোলা থাকে (যা প্রক্রিয়াটির কার্যকর হতে পারে)। আপনি এগুলি তালিকাভুক্ত করতে পারেন fuser; fuser -kতাদের একটি সংকেত প্রেরণ ব্যবহার করুন। উদাহরণস্বরূপ, fuser -k /usr/bin/findচলমান সমস্ত চলমান ইভেন্টগুলিকে হত্যা করে find

যদি কোনও পালিয়ে যাওয়ার প্রক্রিয়া থাকে যা কাঁপতে থাকে তবে আপনার পুরো প্রক্রিয়া গোষ্ঠীটি একবারে মেরে ফেলার প্রয়োজন হতে পারে । একটি প্রক্রিয়া গ্রুপটি তার নেতার নেতিবাচক দ্বারা চিহ্নিত করা হয়, যা গ্রুপের সমস্ত প্রক্রিয়াগুলির পূর্বপুরুষ প্রক্রিয়া। প্রক্রিয়া গ্রুপটি যে প্রক্রিয়াটির অন্তর্ভুক্ত তা দেখতে, চালান ps -o pgid(প্লাস কোন প্রসেসটি নির্বাচন করার জন্য কোনও বিকল্প (এস) প্রদর্শিত হবে)। আপনি যদি নির্ধারণ করেন যে আপনি প্রক্রিয়া গ্রুপের লিডার 1234 এবং তার সমস্ত শিশুদের হত্যা করতে চান, চালান kill -1234বা kill -HUP -1234অন্য কোনও সংকেত।

আপনি যদি আরও ভাল কোনও উপায় খুঁজে না পান তবে psসমস্ত প্রক্রিয়াগুলি তালিকাভুক্ত করতে এবং এটির সাথে grepবা অন্য কোনও পাঠ্য ফিল্টারিং কমান্ডের সাথে ফিল্টার করার জন্য উপযুক্ত বিকল্পগুলি ব্যবহার করুন । অনুরূপ নামের সাথে কোনও কমান্ড চালাচ্ছে বা সেই নামটি যুক্ত যুক্তি সহ দুর্ঘটনাক্রমে অন্য প্রক্রিয়াগুলির সাথে মেলে না সেদিকে খেয়াল রাখুন। উদাহরণ স্বরূপ:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

মনে রাখবেন যে আপনার grepবা awkকমান্ড নিজেই psআউটপুটে তালিকাভুক্ত হতে পারে ( psএবং ফিল্টারিং কমান্ডটি সমান্তরালভাবে শুরু হয়েছিল, সুতরাং এটি প্রদর্শিত হবে কিনা তা সময় নির্ধারণের উপর নির্ভর করবে না)। কমান্ড আর্গুমেন্টগুলি psআউটপুটে অন্তর্ভুক্ত করা থাকলে এটি বিশেষত গুরুত্বপূর্ণ ।


অনেক অনেক ধন্যবাদ, এটি সত্যিই দুর্দান্ত। আপনি যা দিয়েছেন তা হ'ল এক ধরণের টিউটোরিয়াল। আবার ধন্যবাদ . ভোট দিয়েছেন
দ্য ডার্ক নাইট

6

pkillএখানে খুব সুন্দর। প্যাটার্নটি পরিমার্জন করতে আপনি প্রচুর পরিমাণে প্যারামিটার দিতে পারেন।


সমস্ত ইউনিক্সগুলিতে উপলব্ধ নেই এবং প্রশ্নের মধ্যে নির্দিষ্ট ইউএনআইএক্স বা ইউএনআইএক্স-এর মতো ওএসের কোনও উল্লেখ নেই।
এইটবিটটনি

@ আইটবিটটনি pkillলিনাক্স, বিএসডি এবং সোলারিসে উপলব্ধ - আফাইক। সুতরাং এটির চেয়ে আরও বড় ছড়িয়ে পড়েছে killall
নিলস

আমি সম্মত, তবে কিল্ল আরও বেশি সমস্যাযুক্ত কারণ একই নামের একাধিক সরঞ্জাম রয়েছে, যা নাটকীয়ভাবে বিভিন্ন আচরণ বলে মনে হচ্ছে। আমি কিল্লার উত্তরগুলিও পছন্দ করি না। পিকিল এআইএক্স বা এইচপি-ইউএক্স-তে বিদ্যমান নেই এবং কিছু লোক বিশ্বাস করতে চাইলেও, বিশ্বে এখনও লিনাক্স ইউএনআইএক্স-এর একটি উল্লেখযোগ্য ভিত্তি রয়েছে।
এইটবিটটনি

1
@EightBitTony এ কারণেই আপনার উত্তর গৃহীত হয়েছে। তবে আমি এটি সোলারিসে ব্যবহার করব না (যা ইউনিক্সও হয়)।
নিলস

6

সবচেয়ে সহজ উপায় হ'ল প্রথমে আপনি সঠিক প্রক্রিয়া আইডি পেয়ে যাচ্ছেন তা যাচাই করে নিন:

pgrep -f [part_of_a_command]

ফলাফল আশানুরূপ হলে। সঙ্গে যেতে:

pkill -f [part_of_a_command]

বা ব্যবহার:pgrep -f "command name"
ম্যাগনে

3

আকর্ষণীয় কেউ এটির উল্লেখ করেনি। পিডোফ উত্তীর্ণ প্রক্রিয়া নামের সাথে মিলে যায় এমন প্রক্রিয়াগুলির স্পেস-বিভাজিত পিডগুলি আউটপুট দেয়। যেমন, আপনি killপাইপ ছাড়াই সরাসরি এর আউটপুট ব্যবহার করতে পারেন । আর্চ লিনাক্সে আমি ব্যবহার করি

kill -9 $(pidof <proc name>)

এই সমাধানের ক্ষতিটি হ'ল এটি নিয়মিত অভিব্যক্তি ব্যবহারের অনুমতি দেয় না।


0

আমি আপনাকে চেষ্টা করার পরামর্শ দেব pkill

উদা: ps -ef | pkill -f command

হত্যার জন্য সমস্ত প্রক্রিয়াটির তালিকা দেখানোর জন্য প্রথমে চেষ্টা করুন pgrep:

উদা: ps -ef | pgrep -f command


1
আউটপুট বংশীধ্বনিতুল্য উদ্দেশ্য কি ps -efমধ্যে pkillবা pgrep? এই কমান্ডগুলি স্ট্যান্ডার্ড ইনপুট থেকে পঠিত হয় না।
কুসালানন্দ

0

নীচের কমান্ডটি ব্যবহার করে আপনি একাধিক বিভিন্ন প্রক্রিয়া মেরে ফেলতে পারেন

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

মনে রাখবেন যে এটি সেই প্রক্রিয়াটিকে মেরে ফেলবে যা উপরের প্যাটার্নটির সাথে মেলে, মানেও process1abc process2def process3ghiখুন হয়ে যাবে।


-1

pgrep "name-of-application" | xargs kill -9

মনে রাখার মতো যথেষ্ট সাধারণ ছিল এবং আমার পক্ষে সুন্দরভাবে কাজ করেছিল।



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