Twój skrypt ma wiele dziwactw, które prawdopodobnie powinny zostać wyprostowane niezależnie od bezpośredniego problemu.
kill -0 "$$" || exit 0
jest dziwny i prawdopodobnie nie robi nic użytecznego. zgaduję prawdopodobnie po prostu nie powinieneś nic robić w tym przypadku, ponieważ wydaje się, że celem skryptu jest zainstalowanie komponentu, jeśli go brakuje, a następnie przejście domongodb_status=
... część.- Ponieważ w zasadzie wszystkie polecenia tutaj są uprzywilejowane, bardziej sensowne byłoby przerwanie z góry, jeśli cały skrypt nie działa z uprawnieniami.
Stylistycznie wszystko, co wygląda jak sudo bash -c 'singlecommand'
powinno być po prostu sudo singlecommand
; ale dzięki proponowanej refaktoryzacji wcale ich nie potrzebujesz.
Wydaje się, że bezpośrednim problemem z twoim skryptem jest to, że serwer potrzebuje trochę czasu, aby zacząć nasłuchiwać na porcie, dla którego go skonfigurowałeś. Nie wiem wystarczająco dużo o Mongo, aby powiedzieć ci, jak właściwie czekać, aż powie ci, kiedy wszystko jest gotowe, ale dodaję sleep
jest powszechnym (choć surowym) obejściem. Innym jest sprawdzenie pliku dziennika w poszukiwaniu zdarzenia nasłuchu.
#!/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
Nie jestem do końca zadowolony z startit
funkcja -- na początku nie powiodło się, ponieważ próbowałem otworzyć plik dziennika, gdy jeszcze nie istniał, potem nie powiodło się, ponieważ nowe wiersze w pliku dziennika zawierały już komunikat startowy po jednosekundowym śnie. Teraz może się nie powieść, jeśli plik dziennika jest dołączany, a stare dzienniki zawierają komunikat startowy z poprzedniej sesji. Mam nadzieję, że przynajmniej dzięki temu zaczniesz we właściwym kierunku.
Oto refaktoryzacja, która może być bardziej wytrzymałym ...
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
}
Ostatni sleep
to trochę akt desperacji; wydaje się, że zajmuje to chwilę po zalogowaniu się do uruchomienia, dopóki nie zostanie poprawnie uruchomiony i nasłuchuje; i/lub może dodać pętlę ponawiania próby wokół ostatniego mongo
polecenie.