सामान्य तौर पर, यह एक बुरा विचार के साथ सरल दृष्टिकोण की कोशिश करने का है ps
और grep
यदि किसी विशेष प्रक्रिया चल रहा है निर्धारित करने के लिए प्रयास करने के लिए।
इसके pgrep
लिए उपयोग करने से आप बहुत बेहतर होंगे :
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
के लिए मैनुअल देखें pgrep
। कुछ प्रणालियों पर (शायद लिनक्स पर नहीं), आपको एक -q
ध्वज मिलता है जो उसी ध्वज से मेल खाता है grep
जिसके लिए रीडायरेक्ट करने की आवश्यकता से छुटकारा मिलता है /dev/null
। एक -f
ध्वज भी है जो केवल प्रक्रिया नाम पर होने के बजाय पूर्ण कमांड लाइन पर मैच करता है। एक मैच का उपयोग विशिष्ट उपयोगकर्ता से संबंधित प्रक्रियाओं तक सीमित कर सकता है -u
।
इंस्टॉल pgrep
करने से आपको एक्सेस भी मिलता है pkill
, जिससे आप उनके नामों के आधार पर प्रक्रियाओं को संकेत दे सकते हैं।
इसके अलावा, अगर यह एक सेवा डेमॉन है , और यदि आपके यूनिक्स सिस्टम में इसे जानकारी के लिए क्वेरी करने का एक तरीका है (उदाहरण के लिए, यह ऊपर है और चल रहा है या नहीं), तो यह उस पर जाँच का उचित तरीका है।
लिनक्स पर, आपके पास systemctl
( systemctl is-active --quiet varnish
यदि यह चल रहा है, तो 0 वापस आ जाएगा), ओपनबीएसडी पर आपके पास rcctl
, आदि।
अब आपकी स्क्रिप्ट पर:
आपकी स्क्रिप्ट में, आप आउटपुट से पार्स करते हैं ps ax
। इस आउटपुट में स्क्रिप्ट का नाम ही होगा check_varnish_pro.sh
, जिसमें स्पष्ट रूप से स्ट्रिंग शामिल है varnish
। यह आपको एक झूठी सकारात्मक देता है। यदि आपने इसे बिना परीक्षण के -q
लिए ध्वज के बिना चलाया था, तो आपने इसे देखा होगा grep
।
#!/bin/bash
ps ax | grep '[v]arnish'
इसे चलाना:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
एक और मुद्दा यह है कि यद्यपि आप इस grep
प्रक्रिया को "छिपाने" की कोशिश grep
करते [v]
हैं कि पैटर्न का उपयोग करके स्वयं का पता लगाया जा सकता है । यदि आप स्क्रिप्ट या कमांड लाइन को निर्देशिका में चलाने के लिए होते हैं जो उस फ़ाइल या निर्देशिका में नामांकित है varnish
, तो यह दृष्टिकोण विफल हो जाएगा (जिस स्थिति में आपको झूठी सकारात्मक मिलेगी, फिर से)। इसका कारण यह है कि पैटर्न unquoted है और शेल इसके साथ फ़ाइल नाम ग्लोबिंग प्रदर्शन करेगा।
देख:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
फ़ाइल की उपस्थिति varnish
शेल को [v]arnish
फ़ाइल नाम के साथ बदलने का कारण बनेगी varnish
और आपको प्रक्रिया तालिका ( grep
प्रक्रिया) में पैटर्न पर एक हिट मिलेगी ।