MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O script de shell Bash não está se conectando ao MongoDB, mesmo que o status esteja ativo


Seu script tem uma série de esquisitices que provavelmente devem ser corrigidas, independentemente do problema imediato.
  • kill -0 "$$" || exit 0 é estranho e provavelmente não faz nada de útil. Eu acho você provavelmente simplesmente não deve fazer nada neste caso, pois o objetivo do script parece ser instalar o componente se estiver faltando e, em seguida, prosseguir para o mongodb_status= ... parte.
  • Como basicamente todos os comandos aqui são privilegiados, faria mais sentido apenas abortar antecipadamente se o script inteiro não estiver sendo executado com privilégios.

Estilisticamente, tudo o que se parece com sudo bash -c 'singlecommand' deve ser apenas sudo singlecommand; mas com a refatoração proposta, você não precisa disso.

O problema imediato com seu script parece ser que demora um pouco para o servidor começar a escutar na porta para a qual você o configurou. Eu não sei o suficiente sobre o Mongo para dizer a você como esperar corretamente que ele diga quando estiver "de verdade", mas adicionando um sleep é uma solução comum (embora grosseira). Outra é examinar o arquivo de log, procurando o evento de escuta.
#!/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

Não estou totalmente satisfeito com o startit function -- a princípio falhou porque tentei abrir o arquivo de log quando ele ainda não existia, depois falhou porque as novas linhas no arquivo de log já continham a mensagem de inicialização após o sono de um segundo. Agora, ainda pode falhar se o arquivo de log estiver sendo anexado e os logs antigos contiverem a mensagem de inicialização de uma sessão anterior. Mas pelo menos isso deve ajudá-lo a começar na direção certa, espero.

Aqui está uma refatoração que pode ser mais robusto...
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
}

O sleep final é um ato de desespero; parece demorar um pouco depois de registrar a inicialização até que esteja funcionando corretamente e ouvindo; e/ou talvez adicionar um loop de repetição ao redor do mongo final comando.