একটি জম্বি প্রক্রিয়া মারার বিকল্প উপায়


19

আমি মাত্র CentOS 6.8 (ফাইনাল) এ কিছু জম্বি প্রক্রিয়া লক্ষ্য করেছি, তাদের হত্যা করার চেষ্টা করেছি কিন্তু তারা এখনও আছে:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

আপনি দেখতে পাচ্ছেন যে তারা দুই মাস ধরে চলছে, এবং যদি তারা ক্ষতিকারক না হয় তবে আমি তাদের থেকে মুক্তি পাব, কোনও জুম্বুকে মেরে ফেলার কোনও বিকল্প উপায়?


1
আপনি চেষ্টা করেছেন kill -9?
ইপুর সিরার

7
কেবল 747এবং 29971জম্বি প্রক্রিয়াগুলি। অন্যরা হয়ত লক হয়ে আছে তবে তারা এখনও মারা যায় নি।
রোয়াইমা

দেখে মনে হচ্ছে আপনার কোনও কোডে একটি বাগ রয়েছে যা টমক্যাটে চলছে ...
বোরিস দ্য স্পাইডার

উত্তর:


8

হিমাইল দ্বারা উল্লিখিত হিসাবে আপনি আসলে একটি জম্বি মারতে পারবেন না। এটি ইতিমধ্যে মারা গেছে ...

যাইহোক, আপনি যে সমস্যার মুখোমুখি হচ্ছেন সেটি git cloneকমান্ডের সাথে একটি সমস্যার মত দেখাচ্ছে এটি একরকম আটকে যায়। সম্ভবত বার বার আউট বা অন্য কোনওভাবে ব্যর্থ? এটি বেশিরভাগ আই / ও এর কারণে হয় যে কোনও প্রক্রিয়া এমন স্থানে আটকে যায় যেখানে a SIGTERMএবং SIGINTকাজ করবে না।

এটি মারতে, এই ক্ষেত্রে আপনি -9কমান্ড লাইন বিকল্পটি ব্যবহার করতে চান । এর অর্থ SIGKILLসিগন্যালটি প্রেরণ করুন । আপনি আসলে ব্যবহার করতে পারেন -KILL

[root@host user]# kill -KILL 746 29970

উপলব্ধ সিগন্যালের একটি তালিকা পেতে তালিকা কমান্ড লাইন বিকল্পটি ব্যবহার করুন।

[root@host user]# kill -l

এটি আপনাকে নম্বর এবং নামগুলি দেখায় (এবং আপনি এটি দেখতে পাবে # 9 সিগ্কিল বলে))


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

39

আপনি একটি বোকচন্দর (প্রক্রিয়া) হত্যা করতে পারবেন না, এটি ইতিমধ্যে মারা গেছে। এটি কেবলমাত্র তার পিতামাতা প্রক্রিয়াটি করার wait(2)এবং তার প্রস্থান স্থিতি সংগ্রহের জন্য অপেক্ষা করছে । এটি কোনও প্রক্রিয়া সারণী এন্ট্রি ব্যতীত অন্য কোনও সিস্টেমে রিসোর্স নেবে না।

আপনি SIGCHLDতার পিতামাতার কাছে এটি জানতে দিতে পাঠাতে পারেন যে এর কোনও বাচ্চা বন্ধ হয়ে গেছে (যেমন এটি সন্তানের প্রস্থান স্থিতি সংগ্রহের জন্য অনুরোধ করুন)। এই সংকেত উপেক্ষা করা যেতে পারে (যা ডিফল্ট):

kill -CHLD <PPID>

( <PPID>পিতামাতার আসল পিআইডি দিয়ে প্রতিস্থাপন করুন ))

বা আপনি পিতামাতার প্রক্রিয়াটিকে মেরে ফেলতে পারেন যাতে init(পিআইডি 1) জম্বি প্রক্রিয়াটির উত্তরাধিকারী হয় এবং এটি সঠিকভাবে কাটতে পারে (যে initকোনও অনাথের উত্তরাধিকারী হওয়া এবং wait(2)নিয়মিতভাবে সম্পাদন করা এটি অন্যতম প্রধান কাজ )। তবে পিতামাতাকে হত্যা করার পরামর্শ দেওয়া হয় না। সাধারণত, জম্বি প্রক্রিয়াগুলি তৈরি করা প্রোগ্রামিং ইস্যু / ইস্যুগুলি নির্দেশ করে এবং পরিবর্তে আপনার এটি ঠিক করার বা রিপোর্ট করার চেষ্টা করা উচিত।


8
আপনি যদি এটি বাচ্চাদের বন্ধ করে দেয় (তবে এটি বাচ্চার প্রস্থান স্থিতি সংগ্রহের জন্য অনুরোধ করুন) এটি জানাতে আপনি তার পিতামাতার কাছে SIGCHLD প্রেরণ করতে পারেন, এই সংকেতটি উপেক্ষা করা যেতে পারে (ডিফল্ট) এর সাথে সমস্যাটি যদি কোনও প্রক্রিয়া উপেক্ষা করে তবে SIGCHLDকোনও জম্বি নয় তৈরি করা হবে। সুতরাং যদি এটি উপেক্ষা না করা হয় SIGCHLD, এবং জম্বিগুলি আবার কাটাচ্ছে না, প্রক্রিয়াটি বগি হয় বা জম্বি বাচ্চাদের যত্ন করে না। প্রশ্নে প্রক্রিয়াটি দেওয়া হ'ল git clone ..., আমি বাজি দিচ্ছি যে এটি জম্বি বাচ্চাদের সম্পর্কে যত্ন নেবে না কারণ এটি একটি (আশাবাদী) স্বল্প-জীবন প্রক্রিয়া যা তার কাজ করে এবং তারপরে চলে যায়।
অ্যান্ড্রু হেনেল

1
@AndrewHenle: যদিও বেশিরভাগ সত্য, ডিফল্ট অ্যাকশন ( SIG_DFL) জন্য SIGCHILDএটা উপেক্ষা করা আমার কাছে, কিন্তু এই ক্ষেত্রে বোকচন্দর অবশ্যই স্বয়ংক্রিয়ভাবে reaped নেই।
আর ..

@R যদিও বেশিরভাগ সত্য, ডিফল্ট অ্যাকশন ( SIG_DFL) জন্য SIGCHILDএটা উপেক্ষা করা আমার কাছে, কিন্তু এই ক্ষেত্রে বোকচন্দর অবশ্যই স্বয়ংক্রিয়ভাবে reaped নেই। আপনি কী উল্লেখ করছেন তা আমি নিশ্চিত নই। আপনি কি প্রসেসগুলিতে প্রশ্নটি না কাটানোর কথা উল্লেখ করছেন? আমি দেখছি না SIGCHLDযে কোনও প্রক্রিয়াটির SIGCHLDহ্যান্ডলার সেট করা SIG_IGN( কীভাবে স্পষ্টভাবে বা ডিফল্ট দ্বারা) সেট করা হয় সেই প্রক্রিয়াটি কোনও জম্বি ফসল কাটাতে চলেছে।
অ্যান্ড্রু হেনেল

1
@AndrewHenle, একটি পাঠানোর SIGCHLDকাজ করতে পারে এই সময় । শেষ সময় এটি হয়ত সিগন্যালটি মিস করেছিল বা একই সাথে দু'জন বাচ্চা মারা গিয়েছিল এবং কোড দুটি একই সাথে দু'জনের মৃত্যুকে পরিচালনা করতে যথেষ্ট স্মার্ট নয়।
অ্যালেক্সিস উইলক

এটি আঘাত করতে পারে না, তবে আমি এটির সাথে কাজ করতে অসুবিধে করব না।
বার্মার

2

জম্বি প্রক্রিয়াগুলি সন্ধান করতে:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

জম্বি প্রক্রিয়াটি মারতে, পিতামাতাদের আইডিগুলি হত্যা করতে হবে অর্থাৎ পিপিআইডি:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

যখন কোনও পিতামাতার প্রক্রিয়াটি মারা যায়, সমস্ত জম্বি প্রক্রিয়া পরিষ্কার হয়ে যাবে। শুধু জম্বি প্রক্রিয়া পরিষ্কার করতে পিতামাতার প্রক্রিয়াটিকে হত্যা করবেন না। আপনার প্রোগ্রামটি পুনরায় চালানোর সময় এটি আবার আসবে। "ওয়েট ()" বা "ওয়েটপিড ()" সিস্টেম কলকে কল করে আপনার প্রোগ্রামটি ঠিক করুন।

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