सामान्य तौर पर, यह एक बुरा विचार के साथ सरल दृष्टिकोण की कोशिश करने का है 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प्रक्रिया) में पैटर्न पर एक हिट मिलेगी ।