शेल स्क्रिप्ट में `किल -0 $ पिड 'क्या करता है?


139

असल में, '0' किस सिग्नल का प्रतिनिधित्व करता है, क्योंकि यहां मैं 1 से शुरू होने वाले SIGNAL नंबर देखता हूं।



2
इस प्रश्न का Unix.SE संस्करण भी देखें , जो कि (कोई डैश नहीं) से अलग है kill 0, यहाँ और यहाँ समझाया गया है
एडम काट्ज

जवाबों:


136

0दिए गए PIDकिसी भी सिग्नल को सिग्नल भेजना चेक करता है कि क्या दी गई कोई भी प्रक्रिया PIDचल रही है और आपको इसके लिए सिग्नल भेजने की अनुमति है।

अधिक जानकारी के लिए निम्न मैनजेज देखें:

मारने (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यह मेरे Fedora 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 kill1 संशोधन के बाहर है :)
JBaczuk

126

यह एक अच्छा सवाल है क्योंकि ...

... इस विशेष सिग्नल पर प्रलेखन खोजना कठिन हो सकता है। दूसरों ने क्या कहा है, इसके बावजूद man 1 killडेबियन-आधारित प्रणालियों में इस संकेत का एकमात्र उल्लेख है:

विशेष रूप से उपयोगी संकेतों में HUP, INT, KILL, STOP, CONT और 0 शामिल हैं।

विशेष रूप से उपयोगी नहीं है, खासकर यदि आप पहले से ही नहीं जानते कि सिग्नल क्या करता है। के आउटपुट द्वारा भी इसे सूचीबद्ध नहीं किया गया है kill -l, इसलिए आपको इसके बारे में तब तक पता नहीं चलेगा जब तक आप इसके बारे में पहले से ही नहीं जान लेते।

जहां यह खोजने के लिए प्रलेखित

डेबियन और उबंटू सिस्टम पर, man 2 killभाग में, कहते हैं:

यदि sig 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: $?"

मैक और BSD पर यह 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.
lukecampbell

8
यह स्वीकृत उत्तर होना चाहिए। दूसरे की तुलना में बहुत बेहतर। संकेत 0 पर प्रलेखन मुश्किल है। इसे killमैन पेज में दफन किया गया है : "यदि sig 0 है, तो कोई संकेत नहीं भेजा जाता है, लेकिन त्रुटि जाँच अभी भी की जाती है।"
SLM

6

यह कमांड $ पीआईडी ​​में पीआईडी ​​के साथ प्रक्रिया को रोकने के लिए जिंदा है।


1
मैन पेज कहता है: "यदि sig 0 है, तो कोई संकेत नहीं भेजा जाता है, लेकिन त्रुटि जाँच अभी भी की जाती है।" हम यहां किस त्रुटि की जाँच कर रहे हैं?
गंज

2
-1, चूंकि पीआईडी ​​के साथ एक प्रक्रिया $pidचल रही है, लेकिन आपको इसके लिए सिग्नल भेजने की अनुमति नहीं है।
dwalter

2
@dwalter: यदि आपके पास अनुमति नहीं है तो आपको EPERM मिलेगा। यदि यह मौजूद नहीं है, तो आपको ESRCH मिलेगा। kill(1)प्रत्येक के लिए एक अलग त्रुटि प्रिंट होगा। तो, आप बता सकते हैं कि क्या पीआईडी ​​जीवित है चाहे आपको सिग्नल भेजने की अनुमति हो या नहीं। इसके अलावा, सामान्य उपयोग kill -0यह देखने के लिए है कि क्या पिड जीवित है, भले ही वह हमेशा सही तरीके से उपयोग न किया गया हो। मैं कहूंगा कि यह उत्तर सही है (वर्तनी के अलावा)।
camh

3
@camh: kill -0 $pidदोनों मामलों में कोई वापसी मूल्य समान नहीं होगा। यदि आप इस प्रक्रिया को चला रहे हैं या नहीं, तो आपको यह 1बताए बिना वापस नहीं लौटाया जा सकता है कि killआपके पास इसे सिग्नल भेजने की अनुमति नहीं है या नहीं। संपादित करें: हाँ मुझे पता है कि यह जाँच के लिए सबसे अधिक उपयोग किया जाता है कि क्या कोई प्रक्रिया जीवित है, लेकिन यह गलत है जब तक कि आप यह गारंटी नहीं दे सकते कि आपको संकेत भेजने की अनुमति है (जैसे: रूट किया जा रहा है)
dwalter

2
@dwalter: मेरा कहना था कि उत्तर सही है। आपने पांडित्यपूर्ण होने की कोशिश की और बताया कि एक और त्रुटि का मामला था, लेकिन मैं आपको बता रहा हूं कि तकनीकी रूप से उत्तर उस मामले को भी कवर करता है, क्योंकि killबैश बिल्ट-इन (प्रश्न टैग किया गया है bash) stderr, और संकेत पर त्रुटि के प्रकार को आउटपुट करता है इसके रिटर्न कोड में कोई त्रुटि है। यही है, "यह कमांड जाँचता है कि क्या [$ पीआईडी ​​में पीआईडी ​​के साथ प्रक्रिया जीवित है" पूरी तरह से सही है अगर आप आउटपुट की सही व्याख्या करते हैं। [अगर आपने नहीं कहा तो आपने टिप्पणी नहीं की होगी। आपकी टिप्पणी अन्यथा मान्य है]।
11

6

किल -0 $ pid यह जांचने के लिए है कि क्या pid के साथ प्रक्रिया मौजूद है या नहीं।

प्रक्रिया के अस्तित्व की जांच करने के लिए 'किल -0 $ पीड' का उपयोग करते समय सावधान रहें क्योंकि

  1. एक बार इच्छित प्रक्रिया से बाहर निकल जाने के बाद इसकी पिड को अन्य नई बनाई गई प्रक्रिया के लिए आवंटित किया जा सकता है। (इसलिए किसी को यह निश्चित नहीं हो सकता है कि विशेष प्रक्रिया जीवित है या नहीं)

  2. ज़ोंबी प्रक्रिया के मामले में, जिसके लिए बच्चा माता-पिता को प्रतीक्षा करने के लिए इंतजार कर रहा है। यहां यह $ pid को पकड़ता है और सकारात्मक परिणाम देता है, जबकि यह प्रक्रिया नहीं चल रही है।


1

किल -0 $ pid का उपयोग यह जांचने के लिए किया जाता है कि $ pid के साथ चलने वाली प्रक्रिया जीवित है या नहीं। लेकिन यह मुश्किल हो सकता है, क्योंकि प्रक्रिया से बाहर निकलने और नई प्रक्रिया के चलने पर प्रोसेस आईडी को पुन: असाइन किया जा सकता है। एक हत्यारे -0 का उपयोग कर सकते हैं एक विशेष प्रक्रिया के बारे में पाने के लिए चल रहा है या नहीं।


0

EXITसंकेत भेजना , या 0एक प्रक्रिया के लिए:

  1. एक प्रक्रिया के अस्तित्व के लिए जाँच करें।
  2. प्रक्रिया पर विभिन्न त्रुटि जाँच (PID, PGID, आदि ...) करें।
  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 $?
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.