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 omongodb_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.