बैश: यदि / एक पंक्ति में कथन


204

मैं यह जांचने की कोशिश कर रहा हूं कि क्या एक प्रक्रिया (मान लें कि इसे कहा जाता है some_process) एक सर्वर पर चल रही है। यदि है, तो प्रतिध्वनि 1, अन्यथा प्रतिध्वनि 0।

यह वह कमांड है जिसका मैं उपयोग कर रहा हूं लेकिन यह केवल आंशिक रूप से (नीचे अधिक जानकारी) काम करता है। ध्यान दें कि मुझे एक पंक्ति में स्क्रिप्ट लिखने की आवश्यकता है।

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

नोट:[s] में some_proces[s]रोकने के लिए है grepही लौटने से।

अगर some_processचल रहा है, तो "1"गूँजता है, जो ठीक है। हालाँकि, अगर some_processनहीं चल रहा है, तो कुछ भी गूँजता नहीं है।


4
आप उन ps -Ccmdप्रक्रियाओं को खोजने के लिए उपयोग कर सकते हैं जिनका कमांड नाम "cmd" है, जो पूरी तरह से समाप्त कर सकता है greppsयदि यह मिलान प्रक्रिया खोजने में विफल रहता है, तो निकास कोड को कुछ गैर-शून्य मान पर सेट करेगा।
रिसी

जवाबों:


273

स्पष्ट रूप से जांच करने की आवश्यकता नहीं है $?। बस करो:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

ध्यान दें कि यह गूंज पर निर्भर करता है असफल नहीं है, जो निश्चित रूप से गारंटी नहीं है। इसे लिखने का एक अधिक विश्वसनीय तरीका है:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi

9
अगर echo 1फेल हुआ, तो echo 0अंजाम दिया जाएगा। इस स्थिति में, प्रतिध्वनि 1 कभी भी विफल नहीं होगी, लेकिन ध्यान दें कि A && B || C नहीं है तो-और-फिर। C तब चल सकता है जब A सत्य हो। ( शेलचेक से )।
स्कीमाक्स

@schemacs एक बहुत ही मान्य बिंदु बनाता है: एक बेहतर विकल्प प्रदान करने के लिए संपादन।
विलियम पर्सेल

2
क्या किसी फाइल में ps कमांड के आउटपुट को फिर से निर्देशित करना आवश्यक है? यह काम नहीं करेगा? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi। स्थानीय रूप से यह मेरे लिए काम करने लगता है। क्या ऐसा इसलिए है क्योंकि ओपी ने अपने आदेश में पुनर्निर्देशन किया था?

1
आउटपुट को रीडायरेक्ट करने की कोई आवश्यकता नहीं है। मैं मूल स्थिति के लिए सक्षम हूं, क्योंकि मुझे लगता है कि आउटपुट को एक कारण के लिए बचाया जा रहा है। अक्सर इस तरह की चीज़ को केवल दबा दिया जाता है (साथ में grep -q/ देव / अशक्त पर पुनर्निर्देशित)।
विलियम पुरसेल

मैं उपयोग करूंगा pgrep
पाविसोबिल

67

&&का अर्थ है "और यदि सफल"; अपने ifस्टेटमेंट को उसके दाईं ओर रखकर , आप यह सुनिश्चित करते हैं कि यह केवल तभी चलेगा जब grepरिटर्न होगा 0। इसे ठीक करने के लिए, ;इसके बजाय उपयोग करें :

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(या बस एक लाइन-ब्रेक का उपयोग करें)।


6
+1 यह एक बेहतर जवाब है, क्योंकि यह वास्तव में केवल एक विकल्प प्रदान करने के विपरीत सवाल का जवाब देता है।
विलियम पर्ससेल

41

आउटपुट में grep -vcअनदेखा करने और लाइनों को एक साथ गिनने के लिए उपयोग करें ।grepps

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

15

आप इस तरह से &&और ||ऑपरेटरों का पूरा उपयोग कर सकते हैं :

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

Grep को छोड़कर, आप कुछ ऐसा भी कर सकते हैं:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.