Skrip Anda memiliki sejumlah keanehan yang mungkin harus diluruskan terlepas dari masalah langsungnya.
kill -0 "$$" || exit 0
aneh dan mungkin tidak berguna. Saya tebak Anda mungkin tidak boleh melakukan apa pun dalam kasus ini, karena tujuan skrip tampaknya adalah untuk menginstal komponen jika tidak ada, dan kemudian melanjutkan kemongodb_status=
... bagian.- Karena pada dasarnya semua perintah di sini memiliki hak istimewa, akan lebih masuk akal untuk membatalkannya terlebih dahulu jika seluruh skrip tidak berjalan dengan hak istimewa.
Secara gaya, semua yang terlihat seperti sudo bash -c 'singlecommand'
seharusnya sudo singlecommand
; tetapi dengan refactoring yang diusulkan, Anda tidak memerlukannya sama sekali.
Masalah langsung dengan skrip Anda tampaknya adalah perlu beberapa saat bagi server untuk mulai mendengarkan pada port yang Anda konfigurasikan. Saya tidak cukup tahu tentang Mongo untuk memberi tahu Anda cara menunggu dengan benar untuk memberi tahu Anda ketika sudah "nyata" tetapi menambahkan sleep
adalah solusi umum (walaupun kasar). Cara lainnya adalah memeriksa file log, mencari acara mendengarkan.
#!/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
Saya tidak sepenuhnya senang dengan startit
function -- awalnya gagal karena saya mencoba membuka file log padahal belum ada, lalu gagal karena baris baru di file log sudah berisi pesan startup setelah tidur satu detik. Sekarang masih bisa gagal jika file log sedang ditambahkan dan log lama berisi pesan startup dari sesi sebelumnya. Tapi setidaknya ini akan membantu Anda memulai ke arah yang benar, saya harap.
Berikut adalah refactoring yang mungkin menjadi lebih kuat ...
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
}
sleep
terakhir adalah sedikit tindakan putus asa; tampaknya butuh sekejap setelah log startup sampai benar dan mendengarkan; dan/atau mungkin menambahkan loop coba lagi di sekitar mongo
terakhir perintah.