MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Skrypt powłoki Bash nie łączy się z MongoDB, nawet jeśli status jest aktywny

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 do mongodb_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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak połączyć dane z dwóch kolekcji w MongoDB

  2. MongoDB - Java | Jak zarządzać połączeniem

  3. Zapytanie Mongo do sortowania według odrębnej liczby

  4. yii2 z mongodb nie działa przy logowaniu lub rejestracji

  5. Jak zmienić adres IP Ewy?