आपकी स्क्रिप्ट में कई विषमताएं हैं जिन्हें तत्काल समस्या की परवाह किए बिना ठीक किया जाना चाहिए।
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
. के आसपास एक पुन:प्रयास लूप जोड़ें आदेश।