MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Skrip shell bash tidak terhubung ke MongoDB meskipun statusnya aktif

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 ke mongodb_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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pymongo / MongoDB:buat indeks atau pastikan indeks?

  2. Tidak dapat mengirim data ke MongoDB menggunakan Streaming Terstruktur Kafka-Spark

  3. Kesalahan mongod kontainer Docker saat memulai melalui ssh

  4. Bagaimana saya bisa membuat bidang kenaikan otomatis di meteor?

  5. DeprecationWarning:collection.findAndModify tidak digunakan lagi. Gunakan findOneAndUpdate, findOneAndReplace atau findOneAndDelete sebagai gantinya?