बैश स्क्रिप्ट में अपस्टार्ट जॉब की स्थिति कैसे निर्धारित करें?


10

अगर आप एक अपस्कर्ट नौकरी बैश स्क्रिप्ट के अंदर चला रहे हैं, तो आप कैसे निर्धारित करेंगे? मुझे कुछ ऐसा करने के लिए "बूलियन" मान की आवश्यकता है:

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi

जवाबों:


9

अपना स्वयं का बैश फ़ंक्शन बनाएं और इसे अपने में रखें ~/.bashrc:

check_upstart_service(){
    status $1 | grep -q "^$1 start" > /dev/null
    return $?
}

मैं वास्तव में पार्सिंग आउटपुट के तरीके को नापसंद करता हूं, लेकिन मुझे एक और स्पष्ट तरीका नहीं दिखता है। और इस मामले में इसका उत्पादन <service name> startबहुत विश्वसनीय है क्योंकि यह अपस्टार्ट प्रलेखन में निर्दिष्ट है ।

अब आप इसे इस तरह से उपयोग कर सकते हैं:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi

2
आप status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullयह सुनिश्चित करना चाहते हैं कि यह चुप हो जाए।
डेविड जी

1

आम तौर पर आप एक PID फ़ाइल का उपयोग करते हैं लेकिन आप अपनी प्रक्रियाओं की जांच करने के लिए pgrep का भी उपयोग कर सकते हैं। मान लें कि आपकी सेवा को यह कहा जाता है कि jobXयह काम करेगा:

if [ $(pgrep jobX) ]; then

या इससे भी बेहतर

if pgrep jobX > /dev/null 2>&1

1

स्ट्रिंग के आधार पर बैश में शामिल हैं :

job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
  then
    # do whatever you need
  else
    # do whatever you need
fi

मेरा पहला आवेग कोड इमेजिनरी रोबॉट्स की भिन्नता का उपयोग करना था

job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
  /com/ubuntu/Upstart/jobs/${job}/_ \
  org.freedesktop.DBus.Properties.Get string:'' string:state

जो कुछ इस तरह लौटेगा

विधि वापसी प्रेषक =: 1.0 -> भाग्य =: 1.94 उत्तर_सरियल = 2 संस्करण स्ट्रिंग "चल रहा है"

और ऊपर दिए गए समाधान का उपयोग यह जांचने के लिए करें कि क्या दिए गए स्ट्रिंग में "रनिंग" है। हालाँकि मामला यह है कि नौकरी नहीं चल रही है, डब कॉल कॉल स्टेटस 1 से बाहर निकल जाएगी, बजाय "प्रतीक्षा" के जैसे मैं उम्मीद कर रहा था।

status ${job} स्थिति 1 को छोड़कर कभी भी बाहर नहीं निकलेंगे, जब ऐसी कोई नौकरी नहीं होगी।


1
एक भिन्नता ... isRunning = $ (स्थिति $ {job} | grep चल रहा है। wc -l) चल रहा है और यदि नहीं है तो 1 वापस आ जाएगा।
नारन

0

आप उस विशिष्ट सेवा की स्थिति को क्वेरी करने के लिए DBUS का उपयोग करेंगे।

$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''

http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus

ध्यान दें कि यदि आप अपनी खुद की अपस्टार्ट नौकरी लिख रहे हैं, तो आपको इसके बजाय अपस्टार्ट इवेंट या पैकेज निर्भरता का उपयोग करना चाहिए।


ऐसा लगता है कि बस पाठ की स्थिति के कुछ प्रकार मुद्रित करेंगे कि आप एक बूलियन मूल्य प्राप्त करने के लिए पार्स करना होगा, है ना?
लसलोह 19

0

ऐसा लगता है कि अपस्टार्ट स्टेटस कमांड लिनक्स स्टैंडर्ड बेस प्रोजेक्ट से इनिट स्क्रिप्ट विनिर्देश के अनुरूप है, जिसका अर्थ है कि आप 0 के एक्जिट कोड को मान सकते हैं कि प्रोग्राम चल रहा है, 1-3 के एग्जिट कोड का मतलब है कि यह चल रहा है, और कोई भी अन्य निकास कोड का अर्थ अपरिभाषित स्थिति है।

देखें: http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html

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