একটি প্রক্রিয়া মেরে এবং এটি লিনাক্সে 0 ফিরে আসতে বাধ্য করে?


16

লিনাক্স পরিবেশে, আমি কীভাবে কোনও প্রক্রিয়াতে একটি কিল সংকেত পাঠাতে পারি, যখন সেই প্রক্রিয়াটি থেকে প্রস্থানিত কোডটি 0 হয় তা নিশ্চিত করে? এর জন্য কি আমাকে কিছু অভিনব জিডিবি যাদু করতে হবে, নাকি এমন কোনও অভিনব কিল সংকেত আছে যা সম্পর্কে আমি অজানা?

পরীক্ষা ক্ষেত্রে:

cat; echo $?

killall cat

বিভিন্ন কিল সংকেত চেষ্টা করে কেবলমাত্র বিভিন্ন রিটার্ন সিগন্যাল যেমন 129, 137 এবং 143 সরবরাহ করে My

উত্তর:


20

আপনি জিডিবি এবং প্রক্রিয়া আইডি ব্যবহার করে প্রক্রিয়াটি সংযুক্ত করতে পারেন এবং তারপরে একটি যুক্তি হিসাবে callকমান্ডটি জারি করতে পারেন exit(0)

callচলমান প্রোগ্রামের মধ্যে আপনাকে ফাংশনগুলিতে কল করার অনুমতি দেয়। কলিং 0 exit(0)টির একটি রিটার্ন কোড সহ প্রস্থান করে।

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.

এক-লাইন সরঞ্জাম হিসাবে:

gdb --batch --eval-command 'call exit(0)' --pid <process id>

এই না করবে না কাজ যদি প্রোগ্রাম (ছ) libc ব্যবহার করে না, উদাহরণস্বরূপ একটি প্রোগ্রাম সমাবেশ লেখা: No symbol table is loaded. Use the "file" command। যদিও এটি অত্যন্ত সম্ভাবনা কম।
ক্রিশ্চিয়ান সিউপিতু

রুবি স্ক্রিপ্টে কাজ করেছেন :-D
মিখাইল

1
@ ক্রিশ্চিয়ানসিয়ুপিটু এই সমস্যাটির চারপাশে একটি উপায় আছে। পরবর্তী সিস্টেমে প্রবেশের সময় লক্ষ্য সংক্রান্ত প্রোগ্রামটিকে যুক্তি হিসাবে _exitসিস্টেম কলকে কল করার জন্য প্রাসঙ্গিক রেজিস্টারগুলি সংশোধন করুন 0। এটি এমন কোনও প্রক্রিয়াতে কাজ করবে যা কেবল সিপিইউ চক্রগুলি লুপিং এবং বার্ন করে না। যদি প্রক্রিয়াটি অসীম লুপে আটকে না যায়, আপনি প্রয়োজনীয় নির্দেশাবলী কার্যকর করতে গেলে কোথাও খুঁজে পেতে পারেন এবং সেখানে নির্দেশিকা নির্দেশকটি নির্দেশ করতে পারেন তবে আপনি একই পদ্ধতিটি ব্যবহার করতে পারেন।
ক্যাস্পার্ড

@ মিখাইল এটি "একটি রুবি স্ক্রিপ্ট" এ কাজ করেছে কারণ জিডিবি রুবি ইন্টারপ্রেটার প্রক্রিয়ার সাথে সংযুক্ত ছিল যার বাইনারিটি গ্লিবসি-র সাথে যুক্ত ছিল।
ড্যানিয়েল

@ ক্যাস্পারড, হ্যাঁ, আমি যদিও তাই, তবে আরও সুনির্দিষ্ট নির্দেশনাগুলি দুর্দান্ত।
ক্রিশ্চিয়ান সিউপিতু

8

না, যখন শেলটি SIGCHLDএটি শর্তহীন অবস্থায় ধরে যায় তখন শর্তহীনভাবে ফেরত মানটি একটি শূন্য-অ-মানকে যথাযথভাবে সেট করে, সুতরাং এটির জন্য স্ক্রিপ্ট বা শেলের দুটিতে পরিবর্তন প্রয়োজন।


3

আমি নিশ্চিত নই তবে তালিকাভুক্ত সংকেতগুলির কোনও পাওয়া গেলে এটি 0 দিয়ে প্রস্থান করবে। আপনি কোনও ক্রিয়াকলাপ ইত্যাদি কল করা সহ অন্যান্য ক্রিয়া সম্পাদন করতে পারেন

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM

3

এই ওয়ান-লাইনারটি আমার পক্ষে কাজ করেছিল:

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'

আপনি প্রশ্নটি বুঝতে পেরেছি বলে আমি মনে করি না। কোনও উপায় নেই, সেই আদেশটি যা অর্জন করা হচ্ছে তা অর্জন করতে চলেছে। এই আমি কি আপনার কমান্ড ব্যবহার করা থেকে পেয়েছিলাম হল: $ cat; echo $? Terminated 143
ক্যাস্পারড

2
@ লন্ডন থমাসকে এখানে প্রদর্শিত আপনার কোডের লাইনটি আসলে ফিরে আসে 0. তবে যাইহোক যে প্রক্রিয়া_নামটি হত্যা করা হয়েছিল তা 0 ফিরে আসে না, এটি ওপি চেয়েছিল।
ড্যানিয়েল

2

কিছুটা হ্যাকি উপায়, কিন্তু ..

আপনি SIGCHLD হ্যান্ডলারকে ওভাররাইড করে আপনার প্রক্রিয়াতে একটি মোড়ক তৈরি করতে পারেন। উদাহরণ স্বরূপ:

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

এর পরে আপনি আপনার স্ক্রিপ্টটি process PATH এ রেখে এবং একই নামে পুনরায় নামকরণ করে আপনার প্রক্রিয়াটির পরিবর্তে এই র‍্যাপারটি চালিত করতে পারেন।

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