শেল স্ক্রিপ্টে "কিল -0 $ পিডা" কী করে?


139

মূলত, '0' কোন সংকেতটি উপস্থাপন করে, কারণ এখানে আমি সংকেত সংখ্যাগুলি 1 থেকে শুরু করে দেখছি।



2
আরও দেখুন এই প্রশ্নের Unix.SE বৈকল্পিক , যা পৃথক থেকে kill 0(কোন ড্যাশ), ব্যাখ্যা এখানে এবং এখানে
অ্যাডাম কাটজ

উত্তর:


136

সংকেত পাঠানোর 0একটি প্রদত্ত করার PIDপ্রদত্ত যে কোনো প্রক্রিয়া যদি শুধু চেক PIDচলমান ও আপনার করা একটি সংকেত পাঠাতে অনুমতি আছে।

আরও তথ্যের জন্য নিম্নলিখিত manpages দেখুন:

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

7
এই তথ্যের অবস্থান (এটি যদি কিছুতেই বিদ্যমান থাকে) অত্যন্ত সিস্টেম-নির্ভর। সাম্প্রতিক ডেবিয়ান-ভিত্তিক সিস্টেমে man 2 killপরিবর্তে ব্যবহার করুন।
টড এ। জ্যাকবস

2
উভয়ই man 1 killএবং man 2 killএটি আমার ফেডোরা 20 সিস্টেমে ছিল। যদিও এটি উভয়ই পৃষ্ঠাতে সমাহিত করা খুব কঠিন।
slm

অথবা পরিবর্তে If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid. পিক্সস
টমাস হিউজেস

2
আমার মনে হচ্ছে কমান্ডটি man 2 killপ্রথম সংশোধনের বাইরে রয়েছে :)
জেব্যাকজুক

126

এটি একটি ভাল প্রশ্ন কারণ ...

... এই বিশেষ সংকেতটিতে ডকুমেন্টেশনগুলি পাওয়া শক্ত হতে পারে। অন্যেরা যা বলেছে তা সত্ত্বেও, man 1 killদেবিয়ান-ভিত্তিক সিস্টেমগুলিতে এই সংকেতের একমাত্র উল্লেখটি হ'ল

বিশেষত দরকারী সংকেতগুলির মধ্যে HUP, INT, KILL, STOP, CONT, এবং 0 অন্তর্ভুক্ত রয়েছে।

বিশেষভাবে সহায়ক নয়, বিশেষত যদি আপনি ইতিমধ্যে সিগন্যালটি কী তা জানেন না। এটি এর আউটপুট দ্বারাও তালিকাভুক্ত নয় kill -l, সুতরাং আপনি ইতিমধ্যে এটি সম্পর্কে অবগত না হলে আপনি এটি সম্পর্কে জানতে পারবেন না।

কোথায় এটি ডকুমেন্টেড সন্ধান করুন

দেবিয়ান এবং উবুন্টু সিস্টেমে কিছু man 2 killঅংশে আউটপুট বলে:

যদি সিগ 0 হয়, তবে কোনও সংকেত প্রেরণ করা হয় না, তবে ত্রুটি পরীক্ষা করা এখনও কার্যকর হয়; এটি কোনও প্রক্রিয়া আইডি বা প্রক্রিয়া গ্রুপ আইডির অস্তিত্বের জন্য যাচাই করতে ব্যবহার করা যেতে পারে।

এটা কি জন্য ভাল

kill -0কোনও প্রক্রিয়া চলছে কিনা তা পরীক্ষা করতে আপনি ব্যবহার করতে পারেন । এই উদাহরণগুলি বিবেচনা করুন।

# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid

# Check if a PID exists. When missing, this should result
# in output similar to:
#    bash: kill: (6228) - No such process
#    Exit status: 1
kill -0 $pid; echo "Exit status: $?"

kill -0বর্তমান ব্যবহারকারীর প্রদত্ত প্রক্রিয়াটিকে সংকেত দেওয়ার অনুমতি আছে কিনা তা নির্ধারণ করতে আপনিও ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

# See if you have permission to signal the process. If not,
# this should result in output similar to:
#     bash: kill: (15764) - Operation not permitted
#     Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"

ম্যাক এবং বিএসডি-তে এটি kill(2) এখানে স্নিপেটেও নথিভুক্ত করা হয়েছে :The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
লুকেক্যাম্পবেল

8
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অন্যটির চেয়ে অনেক ভাল। সিগন্যালে 0 নথিটি সনাক্ত করা শক্ত। এটি killম্যান পৃষ্ঠায় সমাহিত করা হয়েছে : "যদি সিগ 0 হয়, তবে কোনও সংকেত প্রেরণ করা হয় না, তবু ত্রুটি পরীক্ষা করা হয়।"
slm

6

এই কমান্ডটি পিআইডি-তে পিআইডি সহ প্রক্রিয়াটি বেঁচে আছে কিনা তা পরীক্ষা করে।


1
ম্যান পেজটি বলে: "যদি সিগ 0 হয়, তবে কোনও সংকেত প্রেরণ করা হয় না, তবু ত্রুটি পরীক্ষা করা হয়" " আমরা এখানে কোন ত্রুটি পরীক্ষা করে উল্লেখ করছি?
gjain

2
-১, যেহেতু পিআইডি সহ কোনও প্রক্রিয়া $pidচলমান থাকতে পারে তবে আপনাকে এতে একটি সংকেত প্রেরণের অনুমতি নেই।
দেওয়াল্টার

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

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

2
@ উদ্বিগ্ন: আমার বক্তব্যটি উত্তরটি সঠিক ছিল। আপনি পেডেন্টিক হওয়ার চেষ্টা করেছিলেন এবং আরও একটি ত্রুটিযুক্ত কেস দেখাতে চেয়েছিলেন, তবে আমি আপনাকে বলছি যে প্রযুক্তিগতভাবে উত্তরটি সেই ক্ষেত্রেটিকে অন্তর্ভুক্ত করে যেহেতু killব্যাশ অন্তর্নির্মিত (প্রশ্নটি ট্যাগ করা হয় bash) স্ট্যাডারে ত্রুটির ধরণের ফলাফলকে চিহ্নিত করে, এবং ইঙ্গিত দেয় এর রিটার্ন কোডে একটি ত্রুটি। এটি হল, "এই কমান্ডটি পিআইডি-তে পিআইডি সহ প্রক্রিয়াটি জীবিত কিনা তা পরীক্ষা করে [যদি] আউটপুটটিকে সঠিকভাবে ব্যাখ্যা করে তবে এটি সম্পূর্ণ সঠিক"। [আপনি যদি উত্তর না দিয়ে -1 দিয়েছিলেন তা না বলে আমি মন্তব্য করব না। আপনার মন্তব্য অন্যথায় বৈধ]।
ক্যামহ

6

পিড কিল -0। পিড হ'ল পিড সহ প্রক্রিয়াটি বিদ্যমান কিনা তা পরীক্ষা করা।

প্রক্রিয়াটির অস্তিত্ব পরীক্ষা করতে 'কিল -0 $ পিড' ব্যবহার করার সময় সতর্কতা অবলম্বন করুন কারণ

  1. উদ্দেশ্যপ্রাপ্ত প্রক্রিয়াটি প্রস্থান হওয়ার পরে তার পিডটি অন্য নতুন নির্মিত প্রক্রিয়াতে বরাদ্দ করা যেতে পারে। (সুতরাং কেউ নির্দিষ্ট প্রক্রিয়াটি বেঁচে আছে কিনা তা নিশ্চিত হতে পারে না)

  2. জ্যাম্বো প্রক্রিয়া ক্ষেত্রে, যার জন্য শিশু অপেক্ষা করতে পিতামাতার জন্য অপেক্ষা করছে। এখানে এটি পিড ধরে এবং ইতিবাচক ফলাফল দেয় যখন প্রক্রিয়াটি চলছে না।


1

Ill পিড দিয়ে চলছে এমন কোনও প্রক্রিয়া বেঁচে আছে কি না তা পরীক্ষা করতে ব্যবহৃত কিল -0। পিড ব্যবহার করুন। তবে এটি জটিল হতে পারে, প্রক্রিয়া আইডি যেমন আবার প্রেরণ করা যায়, একবার প্রক্রিয়া প্রস্থান এবং নতুন প্রক্রিয়া চালিত হয়। একটি নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা জানতে কেউ কিল্লাল -0 ব্যবহার করতে পারেন।


0

EXITসিগন্যাল প্রেরণ করা বা 0কোনও প্রক্রিয়াতে পাঠানো :

  1. একটি প্রক্রিয়া অস্তিত্ব জন্য পরীক্ষা করুন।
  2. প্রক্রিয়াটি পরীক্ষা করার জন্য বিভিন্ন ত্রুটি করুন (পিআইডি, পিজিআইডি, ইত্যাদি ...)।
  3. এটি stdoutসাফল্যের উপর কোনও আউটপুট প্রেরণ করবে না ।
  4. এতে একটি ত্রুটি বার্তা প্রেরণ করুন stderrকিছু সঠিক না হলে ।
  5. প্রক্রিয়াটি বিচ্ছিন্ন হয়ে থাকলে (অর্থাত্ জম্বো) যদি আপনাকে একটি মিথ্যা ইতিবাচক দেয়।

আরও স্পষ্টভাবে, আপনার শেল স্ক্রিপ্টগুলির জন্য একটি দরকারী কাজটি হ'ল:

function isProcess ()
{
    kill -s EXIT $1 2> /dev/null
}

এটি stdoutসাফল্যের কোনও পাঠ্য ফেরত দেয় না , stderrব্যর্থতার পরে একটি ত্রুটি বার্তা দেয় (তবে আমি সেই ত্রুটি বার্তাকে পুনঃনির্দেশিত করেছি /dev/null)।

যদি আপনি অকার্যকর / জম্বি প্রক্রিয়া স্থিতি সম্পর্কে উদ্বিগ্ন হন , তবে আপনাকে অবশ্যই স্যুইচ psসহ ব্যবহার করতে --no-headersহবে।

#!/bin/ksh

function trim ()
{
    echo -n "$1" | tr -d [:space:]
}

function getProcessStatus ()
{
    trim $(ps -p $1 -o stat --no-headers)
}

function isZombie ()
{
    typeset processStatus=$(getProcessStatus $1)

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