Dit script har en række mærkværdigheder, som nok skal rettes op uanset det umiddelbare problem.
kill -0 "$$" || exit 0
er mærkeligt og gør sandsynligvis ikke noget nyttigt. Jeg gætter du burde sandsynligvis ikke gøre noget i dette tilfælde, da formålet med scriptet ser ud til at være at installere komponenten, hvis den mangler, og derefter fortsætte tilmongodb_status=
... del.- Da stort set alle kommandoerne her er privilegerede, ville det give mere mening blot at afbryde på forhånd, hvis hele scriptet ikke kører med privilegier.
Stilistisk set alt, der ligner sudo bash -c 'singlecommand'
skal kun være sudo singlecommand
; men med den foreslåede refactoring har du slet ikke brug for disse.
Det umiddelbare problem med dit script ser ud til at være, at det tager et stykke tid for serveren at begynde at lytte på den port, du konfigurerede den til. Jeg ved ikke nok om Mongo til at fortælle dig, hvordan du skal vente på, at den fortæller dig, når den er "rigtigt", men tilføjer en sleep
er en almindelig (omend rå) løsning. En anden er at undersøge logfilen og lede efter lyttehændelsen.
#!/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
Jeg er ikke helt tilfreds med startit
funktion -- først mislykkedes det, fordi jeg forsøgte at åbne logfilen, da den endnu ikke eksisterede, så mislykkedes det, fordi de nye linjer i logfilen allerede indeholdt opstartsmeddelelsen efter et sekunds dvale. Nu kan det stadig mislykkes, hvis logfilen tilføjes, og de gamle logfiler indeholder opstartsmeddelelsen fra en tidligere session. Men det her burde i det mindste få dig i gang i den rigtige retning, håber jeg.
Her er en refaktorering, som måske være mere robust ...
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
}
Den sidste sleep
er lidt af en handling af desperation; det ser ud til at tage et snuptag, efter at den logger opstarten, indtil den er ordentligt oppe og lytter; og/eller måske tilføje en genforsøgsløkke omkring den sidste mongo
kommando.