スクリプトにはいくつかの奇妙な点があり、差し迫った問題に関係なく、おそらく修正する必要があります。
-
kill -0 "$$" || exit 0
奇妙で、おそらく何も役に立ちません。私は推測 スクリプトの目的は、コンポーネントが欠落している場合にコンポーネントをインストールしてから、mongodb_status=
に進むことであると思われるため、この場合はおそらく何もしないでください。 ...一部。 - 基本的にここにあるすべてのコマンドには特権があるため、スクリプト全体が特権で実行されていない場合は、前もって中止する方が理にかなっています。
様式的には、sudo bash -c 'singlecommand'
のように見えるすべてのもの sudo singlecommand
である必要があります;しかし、提案されたリファクタリングでは、これらはまったく必要ありません。
スクリプトの当面の問題は、サーバーが構成したポートでリッスンを開始するのに時間がかかることです。 Mongoについては、「実際に」起動したときに適切に待機して、sleep
を追加する方法を説明するのに十分な知識がありません。 一般的な(粗雑ではありますが)回避策です。もう1つは、ログファイルを調べて、リスニングイベントを探すことです。
#!/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
startit
に完全に満足しているわけではありません 関数-最初はログファイルがまだ存在しないときにログファイルを開こうとしたために失敗しましたが、ログファイルの新しい行に1秒間のスリープ後に起動メッセージがすでに含まれていたために失敗しました。ログファイルが追加されていて、古いログに前のセッションからの起動メッセージが含まれている場合でも、失敗する可能性があります。しかし、少なくともこれで正しい方向に進むことができると思います。
可能性があるリファクタリングは次のとおりです。 より堅牢になる...
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
ちょっとした必死の行為です。スタートアップをログに記録してから、適切に起動してリッスンするまで、少し時間がかかるようです。および/または最後のmongo
の周りに再試行ループを追加する可能性があります コマンド。