আমি সম্প্রতি এটি শেল স্ক্রিপ্টে এসেছি।
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
কি করে kill -0 ...
?
kill -0 $pid
? পাশাপাশি 0 কে হত্যা করে আসলে কী করে? ।
আমি সম্প্রতি এটি শেল স্ক্রিপ্টে এসেছি।
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
কি করে kill -0 ...
?
kill -0 $pid
? পাশাপাশি 0 কে হত্যা করে আসলে কী করে? ।
উত্তর:
এটি একসাথে কাটাতে খুব শক্ত তবে আপনি নীচের ২ টি ম্যান পেজটি দেখলে নীচের নোটগুলি দেখতে পাবেন:
হত্যা (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
হত্যা (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID.
...
সুতরাং সিগন্যাল 0 আসলে আপনার প্রসেসের পিআইডি-তে আসলে কিছুই প্রেরণ করবে না, তবে এটি করার অনুমতি আপনার আছে কিনা তা যাচাই করবে।
একটি স্পষ্ট জায়গা হ'ল যদি আপনি এটি নির্ধারণের চেষ্টা করছেন যে আপনার মাধ্যমে কোনও চলমান প্রক্রিয়াতে সংকেত প্রেরণের অনুমতি ছিল কিনা kill
। আপনি kill
যে আসল সিগন্যালটি চান তা প্রেরণ করার আগে আপনি যা যা kill -0 <PID>
প্রথমে অনুমোদিত তা নিশ্চিত করার জন্য একটি চেক মোড়ক করে পরীক্ষা করতে পারেন ।
বলুন যে কোনও প্রক্রিয়া রুট দ্বারা চালিত হয়েছিল:
$ sudo sleep 2500 &
[1] 15693
এখন অন্য উইন্ডোতে আমরা এই কমান্ডটি চালিয়ে দিলে আমরা নিশ্চিত করতে পারি যে পিআইডি চলছে।
$ pgrep sleep
15693
এখন আসুন এই পিআইডি সিগন্যালগুলি মাধ্যমে প্রেরণে আমাদের অ্যাক্সেস আছে কিনা তা দেখার জন্য এই আদেশটিটি ব্যবহার করে দেখুন kill
।
$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!
সুতরাং এটি কাজ করে, কিন্তু আউটপুট kill
কমান্ড থেকে একটি বার্তা ফাঁস করছে যে আমাদের অনুমতি নেই। কোনও বড় কথা নয়, কেবল এসটিডিআরআর ধরুন এবং এটিকে প্রেরণ করুন /dev/null
।
$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!
তাহলে আমরা এই জাতীয় কিছু করতে পারি killer.bash
:
#!/bin/bash
PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then
echo "you don't have permissions to kill PID:$PID"
exit 1
fi
kill -9 $PID
এখন যখন আমি উপরেরটি একটি অ-রুট ব্যবহারকারী হিসাবে চালিত করি:
$ ~/killer.bash
you don't have permissions to kill PID:15693
$ echo $?
1
তবে এটি যখন রুট হিসাবে চালানো হয়:
$ sudo ~/killer.bash
$ echo $?
0
$ pgrep sleep
$
pgrep
, ps
পার্সিং বা test -e /proc/$PID
পোর্টেবল স্ক্রিপগুলিতে ব্যবহার করতে পারবেন না তবে kill -0
সর্বত্র কাজ করে। যদি আপনাকে এমন একটি পিআইডি দেওয়া হয় যা বাসি হতে পারে - যেমন একটি /var/run
এন্ট্রি - প্রক্রিয়াটি এখনও বেঁচে আছে কিনা তা পরীক্ষা করার এই বহনযোগ্য উপায়।
kill -0 $(pgrep sleep)
অগত্যা আপনার দুর্বল হওয়ার অর্থ এটি হতে পারে না , যদি কোনও sleep
কমান্ড চলমান না থাকে, বা একাধিক এবং যদি এমন একটি থাকে যে আপনি হত্যা করতে পারবেন না, বা যদি পিগ্রেপ এবং কিলের মধ্যে কেউ ঘুমিয়ে যায় তবে কমান্ড চালানো হচ্ছে।
kill -0
(বা এর আরও বহনযোগ্য পসিক্স বৈকল্পিক kill -s 0
) একটি সংকেত প্রেরণের গতি দিয়ে যায়, তবে আসলে এটি কোনও প্রেরণ করে না। এটি অন্তর্নিহিত সি এপিআইয়ের একটি বৈশিষ্ট্য যা শেল কমান্ডটি সোজা উপায়ে প্রকাশ করে।
kill -s 0 -- "$pid"
সুতরাং প্রদত্ত পিআইডি (বা পিজিআইডি $pid
নেতিবাচক হলে) সহ একটি চলমান প্রক্রিয়া রয়েছে কিনা তা পরীক্ষা করে , এবং বর্তমান প্রক্রিয়াটিতে এটি (নেতিবাচক ক্ষেত্রে প্রক্রিয়া গ্রুপের কোনও প্রক্রিয়াগুলির $pid
) কোনও সিগন্যাল প্রেরণের অনুমতি থাকবে কিনা তা পরীক্ষা করে । কোনও প্রক্রিয়া (বা প্রক্রিয়া গ্রুপ) বেঁচে আছে কিনা তা পরীক্ষা করার বেশিরভাগ উপায় way
মনে রাখবেন যে প্রত্যাশিত পিআইডি এবং অনুমতিগুলি নিয়ে কোনও চলমান প্রক্রিয়া থাকলেও এটি আপনার প্রত্যাশা করা প্রক্রিয়াটি অগত্যা নয়। এটি সম্ভব যে আপনি যে প্রক্রিয়াটি প্রত্যাশা করেছিলেন তা আগে মারা গিয়েছিল এবং এর পিআইডি কোনও সম্পর্কযুক্ত প্রক্রিয়ার জন্য পুনরায় ব্যবহার করা হয়েছিল। প্রক্রিয়াগুলি পর্যবেক্ষণ করার সঠিক উপায় হ'ল তাদের পিতামাতাকে এটি করার অনুমতি দেওয়া - কোনও প্রক্রিয়াটির পিআইডি পুনরায় ব্যবহার করা না হওয়া অবধি তার পিতা-মাতার মৃত্যুর বিষয়টি স্বীকার না করে (এজন্য জম্বিগুলির উপস্থিতি রয়েছে), সুতরাং কোনও প্রক্রিয়ার পিতামাতারা তাদের পিআইডি দ্বারা নির্ভরযোগ্যভাবে তার শিশুদের সনাক্ত করতে পারবেন।
kill -0 $pid
আপনি বলে যদি একটি প্রক্রিয়ার সঙ্গে $pid
বিদ্যমান।
স্নিপেটে
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
ব্লকটি ... do something ...
কার্যকর করা হয় যদি সঞ্চিত পিআইডি সহ কোনও প্রক্রিয়া /path/to/file.pid
চলমান থাকে - এবং - স্নিপেটটি রুট হিসাবে চালিত না করা - যদি পিআইডি একই ব্যবহারকারীর অধীনে চলে।
POSIX মান 0
সিগন্যালের ভূমিকা নির্দিষ্ট করে :
যদি সিগ 0 হয় (নাল সিগন্যাল), ত্রুটি পরীক্ষা করা হয় তবে কোনও সংকেত আসলে প্রেরণ করা হয় না। নাল সিগন্যালটি পিডের মেয়াদ যাচাই করতে ব্যবহার করা যেতে পারে।
(হত্যা (3 পি), পসিএক্স 1-2-2008 - পসিক্স ১.২-২০০১ এ একই শব্দ)
নোট করুন যে পসআইএক্স উভয় kill -0
এবং kill -s 0
কমান্ড লাইন শৈলী (কিল (1 পি)) নির্দিষ্ট করে।
কিল সিস্কেল ইন্টারফেসের বিপরীতে kill
কমান্ডটি অন্য ব্যবহারকারীদের (একটি সাধারণ ব্যবহারকারী হিসাবে) মালিকানাধীন পিআইডি'র অস্তিত্বের জন্য নির্ভরযোগ্যভাবে পরীক্ষা করতে ব্যবহার করা যাবে না, যেমন:
$ kill -0 123
kill: kill 123 failed: no such process
$ echo $?
1
বনাম
$ kill -0 1
kill: kill 1 failed: operation not permitted
$ echo $?
1
কিল সিস্কেলকে কল করার সময় errno
মানটি (সিএফ। উদাহরণস্বরূপ পাইথনের উদাহরণ ) দেখার মাধ্যমে এই কেসগুলি নির্ভরযোগ্যভাবে পার্থক্য করতে পারে ।
trap
কমান্ড এবং 0 বনাম একটি সংকেত 0 থেকে পার্থক্য সম্পর্কে বিভ্রান্ত হনkill
: একটি ট্র্যাপ কমান্ডে সিগন্যাল 0 কী?