जवाबों:
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.
...
man 2 kill
बजाय , का उपयोग करें ।
man 1 kill
और man 2 kill
यह मेरे Fedora 20 सिस्टम पर था। हालांकि, उन दोनों मैन पेजों में दफन होना मुश्किल है।
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.
पॉज़िक्स
man 2 kill
1 संशोधन के बाहर है :)
... इस विशेष सिग्नल पर प्रलेखन खोजना कठिन हो सकता है। दूसरों ने क्या कहा है, इसके बावजूद 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: $?"
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.
kill
मैन पेज में दफन किया गया है : "यदि sig 0 है, तो कोई संकेत नहीं भेजा जाता है, लेकिन त्रुटि जाँच अभी भी की जाती है।"
यह कमांड $ पीआईडी में पीआईडी के साथ प्रक्रिया को रोकने के लिए जिंदा है।
$pid
चल रही है, लेकिन आपको इसके लिए सिग्नल भेजने की अनुमति नहीं है।
kill(1)
प्रत्येक के लिए एक अलग त्रुटि प्रिंट होगा। तो, आप बता सकते हैं कि क्या पीआईडी जीवित है चाहे आपको सिग्नल भेजने की अनुमति हो या नहीं। इसके अलावा, सामान्य उपयोग kill -0
यह देखने के लिए है कि क्या पिड जीवित है, भले ही वह हमेशा सही तरीके से उपयोग न किया गया हो। मैं कहूंगा कि यह उत्तर सही है (वर्तनी के अलावा)।
kill -0 $pid
दोनों मामलों में कोई वापसी मूल्य समान नहीं होगा। यदि आप इस प्रक्रिया को चला रहे हैं या नहीं, तो आपको यह 1
बताए बिना वापस नहीं लौटाया जा सकता है कि kill
आपके पास इसे सिग्नल भेजने की अनुमति नहीं है या नहीं। संपादित करें: हाँ मुझे पता है कि यह जाँच के लिए सबसे अधिक उपयोग किया जाता है कि क्या कोई प्रक्रिया जीवित है, लेकिन यह गलत है जब तक कि आप यह गारंटी नहीं दे सकते कि आपको संकेत भेजने की अनुमति है (जैसे: रूट किया जा रहा है)
kill
बैश बिल्ट-इन (प्रश्न टैग किया गया है bash
) stderr, और संकेत पर त्रुटि के प्रकार को आउटपुट करता है इसके रिटर्न कोड में कोई त्रुटि है। यही है, "यह कमांड जाँचता है कि क्या [$ पीआईडी में पीआईडी के साथ प्रक्रिया जीवित है" पूरी तरह से सही है अगर आप आउटपुट की सही व्याख्या करते हैं। [अगर आपने नहीं कहा तो आपने टिप्पणी नहीं की होगी। आपकी टिप्पणी अन्यथा मान्य है]।
किल -0 $ pid यह जांचने के लिए है कि क्या pid के साथ प्रक्रिया मौजूद है या नहीं।
प्रक्रिया के अस्तित्व की जांच करने के लिए 'किल -0 $ पीड' का उपयोग करते समय सावधान रहें क्योंकि
एक बार इच्छित प्रक्रिया से बाहर निकल जाने के बाद इसकी पिड को अन्य नई बनाई गई प्रक्रिया के लिए आवंटित किया जा सकता है। (इसलिए किसी को यह निश्चित नहीं हो सकता है कि विशेष प्रक्रिया जीवित है या नहीं)
ज़ोंबी प्रक्रिया के मामले में, जिसके लिए बच्चा माता-पिता को प्रतीक्षा करने के लिए इंतजार कर रहा है। यहां यह $ pid को पकड़ता है और सकारात्मक परिणाम देता है, जबकि यह प्रक्रिया नहीं चल रही है।
किल -0 $ pid का उपयोग यह जांचने के लिए किया जाता है कि $ pid के साथ चलने वाली प्रक्रिया जीवित है या नहीं। लेकिन यह मुश्किल हो सकता है, क्योंकि प्रक्रिया से बाहर निकलने और नई प्रक्रिया के चलने पर प्रोसेस आईडी को पुन: असाइन किया जा सकता है। एक हत्यारे -0 का उपयोग कर सकते हैं एक विशेष प्रक्रिया के बारे में पाने के लिए चल रहा है या नहीं।
EXIT
संकेत भेजना , या 0
एक प्रक्रिया के लिए:stdout
सफलता पर ।stderr
यदि कुछ सही नहीं है तो ।अधिक स्पष्ट रूप से, आपके शेल स्क्रिप्ट के लिए एक उपयोगी कार्य होगा:
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 $?
}