MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Bash shell script không nhận được kết nối với MongoDB ngay cả khi trạng thái đang hoạt động

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ào mongodb_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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để xoay vòng trên MongoDB

  2. MongoDB đồng bộ hóa cơ sở dữ liệu Phát triển và Sản xuất

  3. Truy vấn không thành công với mã lỗi 13 và thông báo lỗi 'không được phép trên [db] để thực thi lệnh {find:

  4. Cách cập nhật tài liệu trong MongoDB bằng ObjectID trong Java

  5. Xem hơn 20 tài liệu gần đây nhất trong MongoDB Compass từ Schema