MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्थिति सक्रिय होने पर भी बैश शेल स्क्रिप्ट MongoDB से कनेक्ट नहीं हो रही है

आपकी स्क्रिप्ट में कई विषमताएं हैं जिन्हें तत्काल समस्या की परवाह किए बिना ठीक किया जाना चाहिए।

  • kill -0 "$$" || exit 0 अजीब है और शायद कुछ भी उपयोगी नहीं है। मैं अनुमान करता हूं आपको शायद इस मामले में कुछ भी नहीं करना चाहिए, क्योंकि ऐसा लगता है कि स्क्रिप्ट का उद्देश्य घटक को स्थापित करना है यदि यह गायब है, और फिर mongodb_status= में आगे बढ़ें। ... भाग।
  • चूंकि मूल रूप से यहां सभी आदेश विशेषाधिकार प्राप्त हैं, इसलिए यदि पूरी स्क्रिप्ट विशेषाधिकारों के साथ नहीं चल रही है, तो इसे आगे ही निरस्त करना अधिक उचित होगा।

शैलीगत रूप से, सब कुछ जो sudo bash -c 'singlecommand' जैसा दिखता है बस sudo singlecommand होना चाहिए; लेकिन प्रस्तावित रिफैक्टरिंग के साथ, आपको इनकी बिल्कुल भी आवश्यकता नहीं है।

आपकी स्क्रिप्ट के साथ तत्काल समस्या यह प्रतीत होती है कि सर्वर को आपके द्वारा कॉन्फ़िगर किए गए पोर्ट पर सुनना शुरू करने में कुछ समय लगता है। मैं मोंगो के बारे में इतना नहीं जानता कि आपको यह बताने के लिए कि "असली" होने पर आपको यह बताने के लिए कि कैसे ठीक से प्रतीक्षा करनी है, लेकिन एक sleep जोड़ना है एक सामान्य (यद्यपि क्रूड) वर्कअराउंड है। दूसरा लॉग फ़ाइल की जांच करना है, जो सुनने की घटना की तलाश में है।

#!/bin/bash

# Test for privileged access
test -w / ||
{ echo "$0: need to run privileged; aborting" >&2; exit 127; }

startit () {
    local log=/var/log/mongodb/mongod.log
    service mongod start
    while true; do
        test -e "$log" && break
        sleep 1
    done
    grep -q 'port: 27017' "$log" ||
    tail -0f "$log" |
    grep -q 'port: 27017'
}

if [ -f /usr/bin/mongod ]; then
    # Send diagnostic messages to standard error
    echo "$0: MongoDB is installed on your machine." >&2
else
    # Reduce eyesore
    echo "$0: MongoDB is not installed; proceed with 4.0 install" >&2
    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 68818C72E52529D4
    echo "deb http://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" >/etc/apt/sources.list.d/mongodb-org-4.0.list
    apt update && apt upgrade -y
    apt-get install -y mongodb-org
    # not necessary or useful to do a second time
    # apt update && apt upgrade -y
    apt -y autoremove && apt clean
    mkdir -p /data/db
    systemctl enable mongod
    startit
    # service mongod restart  # is this really useful and necessary?
fi
echo "$0: database initialization" >&2

# Prefer modern command substitution syntax
mongod_status=$(systemctl is-active mongod)
echo "$mongod_status" >&2

if [[ "${mongod_status}" == "active" ]]
then
    echo "$0: MongoDB is already running." >&2
else
    echo "$0: MongoDB is not running" >&2
    rm -f /var/lib/mongodb/mongod.lock
    startit
fi

mongo <<EOF
        use fragment
        db.createCollection("fragmenthash");
EOF

मैं startit . से पूरी तरह खुश नहीं हूं फ़ंक्शन - पहले तो यह विफल रहा क्योंकि मैंने लॉग फ़ाइल को खोलने का प्रयास किया था जब यह अभी तक मौजूद नहीं था, फिर यह विफल हो गया क्योंकि लॉग फ़ाइल में नई पंक्तियों में पहले से ही एक सेकंड की नींद के बाद स्टार्टअप संदेश था। अब यह तब भी विफल हो सकता है यदि लॉग फ़ाइल को जोड़ा जा रहा है और पुराने लॉग में पिछले सत्र से स्टार्टअप संदेश है। लेकिन कम से कम यह आपको सही दिशा में शुरू करना चाहिए, मुझे आशा है।

यहां एक रिफैक्टरिंग है जो हो सकता है अधिक मजबूत बनें ...

startit () {
    local log=/var/log/mongodb/mongod.log
    sudo -u mongodb touch "$log"
    service mongod start &
    local launcher=$!
    tail -0f "$log" |
    grep -q 'port: 27017'
    wait "$launcher"
    sleep 1
}

अंतिम sleep हताशा का एक कार्य का एक सा है; ऐसा लगता है कि स्टार्टअप को लॉग इन करने के बाद यह ठीक से ऊपर और सुन रहा है; और/या शायद अंतिम mongo . के आसपास एक पुन:प्रयास लूप जोड़ें आदेश।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB कई सरणियों को खोल देता है

  2. उत्पादन में प्रतिकृति सेट के रूप में एक एकल MongoDB उदाहरण क्यों शुरू करने की अनुशंसा नहीं की जाती है?

  3. MongoDB ड्राइवर में घटनाओं को फिर से जोड़ने के लिए सुनें

  4. MongoDB में समूह और गिनती

  5. दो क्षेत्रों के साथ MongoDB कुल सरणी