`হত্যা -0` কী করে?


61

আমি সম্প্রতি এটি শেল স্ক্রিপ্টে এসেছি।

if ! kill -0 $(cat /path/to/file.pid); then
    ... do something ...
fi

কি করে kill -0 ...?


2
এখানে দেখুন যদি আপনি বি / ডাব্লু বাশ-এর trapকমান্ড এবং 0 বনাম একটি সংকেত 0 থেকে পার্থক্য সম্পর্কে বিভ্রান্ত হন kill: একটি ট্র্যাপ কমান্ডে সিগন্যাল 0 কী?
slm

পুরানো স্ট্যাকওভারফ্লো প্রশ্নটিও দেখুন শেল স্ক্রিপ্টে কী করে kill -0 $pid? পাশাপাশি 0 কে হত্যা করে আসলে কী করে?
অ্যাডাম কাটজ

উত্তর:


76

এটি একসাথে কাটাতে খুব শক্ত তবে আপনি নীচের ২ টি ম্যান পেজটি দেখলে নীচের নোটগুলি দেখতে পাবেন:

হত্যা (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
$

9
আমি আরও যুক্ত করব যে এটি কোনও প্রক্রিয়া এখনও লাইভ আছে কিনা তা দেখার জন্য মাল্টি-প্রোক স্ক্রিপ্টগুলির জন্য ব্যবহার করা যেতে পারে।
prateek61

1
@ এসএমএল সুন্দর সন্ধান করুন। এই যুক্তিটি এখনই স্ক্রিপ্টে ব্যবহার করছি যা আমি লিখছি, ধন্যবাদ।
111 ---

12
Prateek61 ঠিক আছে। আপনি ব্যবহার pgrep, psপার্সিং বা test -e /proc/$PIDপোর্টেবল স্ক্রিপগুলিতে ব্যবহার করতে পারবেন না তবে kill -0সর্বত্র কাজ করে। যদি আপনাকে এমন একটি পিআইডি দেওয়া হয় যা বাসি হতে পারে - যেমন একটি /var/runএন্ট্রি - প্রক্রিয়াটি এখনও বেঁচে আছে কিনা তা পরীক্ষা করার এই বহনযোগ্য উপায়।
ওয়ারেন ইয়ং

1
পিআইডি বেঁচে আছে কি না তা বলার পাশাপাশি এটি আপনার ইউআইডি থেকে এখনও কোনও প্রক্রিয়া চলছে কিনা তা কার্যকরভাবে আপনাকে জানায়, যেহেতু আপনার কাছে অন্য ইউআইডিগুলিতে সিগন্যাল প্রেরণের অনুমতি নেই (আপনি যদি না মূল না হন)। এটি পিআইডি পুনরায় ব্যবহারের সম্ভাবনা কম বলে মিথ্যা ইতিবাচক করে তোলে।
বার্মার

ব্যর্থতা kill -0 $(pgrep sleep)অগত্যা আপনার দুর্বল হওয়ার অর্থ এটি হতে পারে না , যদি কোনও sleepকমান্ড চলমান না থাকে, বা একাধিক এবং যদি এমন একটি থাকে যে আপনি হত্যা করতে পারবেন না, বা যদি পিগ্রেপ এবং কিলের মধ্যে কেউ ঘুমিয়ে যায় তবে কমান্ড চালানো হচ্ছে।
স্টাফেন চেজেলাস

22

kill -0(বা এর আরও বহনযোগ্য পসিক্স বৈকল্পিক kill -s 0) একটি সংকেত প্রেরণের গতি দিয়ে যায়, তবে আসলে এটি কোনও প্রেরণ করে না। এটি অন্তর্নিহিত সি এপিআইয়ের একটি বৈশিষ্ট্য যা শেল কমান্ডটি সোজা উপায়ে প্রকাশ করে।

kill -s 0 -- "$pid"সুতরাং প্রদত্ত পিআইডি (বা পিজিআইডি $pidনেতিবাচক হলে) সহ একটি চলমান প্রক্রিয়া রয়েছে কিনা তা পরীক্ষা করে , এবং বর্তমান প্রক্রিয়াটিতে এটি (নেতিবাচক ক্ষেত্রে প্রক্রিয়া গ্রুপের কোনও প্রক্রিয়াগুলির $pid) কোনও সিগন্যাল প্রেরণের অনুমতি থাকবে কিনা তা পরীক্ষা করে । কোনও প্রক্রিয়া (বা প্রক্রিয়া গ্রুপ) বেঁচে আছে কিনা তা পরীক্ষা করার বেশিরভাগ উপায় way

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


0

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মানটি (সিএফ। উদাহরণস্বরূপ পাইথনের উদাহরণ ) দেখার মাধ্যমে এই কেসগুলি নির্ভরযোগ্যভাবে পার্থক্য করতে পারে ।

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