Tập lệnh của bạn có một số điểm kỳ lạ có thể cần được giải quyết bất kể vấn đề trước mắt là gì.
-
kill -0 "$$" || exit 0
là kỳ lạ và có lẽ không có ích gì. Tôi đoán bạn có thể đơn giản là không nên làm gì trong trường hợp này, vì mục đích của tập lệnh dường như là cài đặt thành phần nếu nó bị thiếu và sau đó tiếp tục vàomongodb_status=
... phần. - Về cơ bản, tất cả các lệnh ở đây đều là đặc quyền, sẽ hợp lý hơn nếu bạn chỉ hủy bỏ trước nếu toàn bộ tập lệnh không chạy với các đặc quyền.
Về mặt phong cách, mọi thứ trông giống như sudo bash -c 'singlecommand'
chỉ nên là sudo singlecommand
; nhưng với việc tái cấu trúc được đề xuất, bạn hoàn toàn không cần những thứ này.
Vấn đề ngay lập tức với tập lệnh của bạn dường như là phải mất một lúc để máy chủ bắt đầu lắng nghe trên cổng mà bạn đã định cấu hình. Tôi không biết đầy đủ về Mongo để cho bạn biết cách chờ đúng cách cho đến khi nó báo cho bạn biết khi nó hoạt động "thật" nhưng thêm một sleep
là một cách giải quyết phổ biến (mặc dù thô thiển). Cách khác là kiểm tra tệp nhật ký, tìm kiếm sự kiện lắng nghe.
#!/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
Tôi không hoàn toàn hài lòng với startit
chức năng - lúc đầu nó không thành công vì tôi đã cố gắng mở tệp nhật ký khi nó chưa tồn tại, sau đó nó không thành công vì các dòng mới trong tệp nhật ký đã chứa thông báo khởi động sau chế độ ngủ một giây. Bây giờ nó vẫn có thể không thành công nếu tệp nhật ký đang được nối và các nhật ký cũ chứa thông báo khởi động từ một phiên trước đó. Nhưng ít nhất điều này sẽ giúp bạn bắt đầu đúng hướng, tôi hy vọng.
Đây là một cấu trúc lại mà có thể mạnh mẽ hơn ...
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
cuối cùng là một chút hành động của sự tuyệt vọng; Có vẻ như sẽ mất một chút thời gian sau khi ghi nhật ký khởi động cho đến khi nó hoạt động tốt và lắng nghe; và / hoặc có thể thêm một vòng lặp thử lại xung quanh mongo
cuối cùng lệnh.