2013-03-15 22 views
6

Tôi có một tập lệnh bash shell thực hiện một loạt các công cụ trước khi thử nghiệm mongorestore.cách kiểm tra xem mongodb có sẵn sàng và sẵn sàng chấp nhận các kết nối từ tập lệnh bash không?

tôi muốn đảm bảo rằng không chỉ mongodb là lên, nhưng nó cũng sẵn sàng chấp nhận các kết nối trước khi tôi thử khôi phục.

ngay bây giờ, những gì tôi thấy là, mongo quá trình lên nhưng phải mất 45 + giây để làm thiết lập ban đầu (thiết lập các tập tin tạp chí vv) trước khi nó sẵn sàng chấp nhận kết nối. Lý tưởng nhất là tôi muốn tiếp tục thử nghiệm kết nối trong một vòng lặp và chỉ khi tôi có thể kết nối, tôi muốn chạy mongorestore.

Ai đó có thể chỉ cho tôi cách thực hiện điều này trong bash hoặc hướng tôi đi đúng hướng?

Rất cám ơn!

--su

+0

Khi một trường hợp mongod sẵn sàng là nhật ký giống như "đang chờ kết nối trên cổng 27017". Bạn có thể chỉ cần tail đăng nhập chờ đợi cho rằng dòng đầu ra và sau đó bắt đầu chạy mongo khôi phục lại một khi thông điệp đó đã được đăng nhập. Không chắc chắn nếu đây là giải pháp tốt nhất, nhưng nó nên làm việc – ACE

Trả lời

7

Gần đây tôi có cùng một vấn đề. Tôi quyết định cấu hình mongod để đăng nhập tất cả đầu ra của nó vào một logfile và sau đó chờ trong một vòng lặp kiểm tra logfile cho đến khi chúng ta thấy một số đầu ra cho thấy mongod đã sẵn sàng.

Đây là một ví dụ dòng đầu ra logfile chúng ta cần phải chờ đợi:

Tue Dec 3 14:25:28.217 [initandlisten] waiting for connections on port 27017 

Đây là kịch bản bash tôi đã đưa ra:

 
#!/bin/bash 

# Initialize a mongo data folder and logfile 
mkdir -p /data/db 
touch /var/log/mongodb.log 

# Start mongodb with logging 
# --logpath Without this mongod will output all log information to the standard output. 
# --logappend Ensure mongod appends new entries to the end of the logfile. We create it first so that the below tail always finds something 
/usr/bin/mongod --quiet --logpath /var/log/mongodb.log --logappend & 

# Wait until mongo logs that it's ready (or timeout after 60s) 
COUNTER=0 
grep -q 'waiting for connections on port' /var/log/mongodb.log 
while [[ $? -ne 0 && $COUNTER -lt 60 ]] ; do 
    sleep 2 
    let COUNTER+=2 
    echo "Waiting for mongo to initialize... ($COUNTER seconds so far)" 
    grep -q 'waiting for connections on port' /var/log/mongodb.log 
done 

# Now we know mongo is ready and can continue with other commands 
... 

Thông báo kịch bản sẽ không chờ đợi mãi mãi, nó sẽ hết thời gian sau 60 giây - bạn có thể hoặc không muốn điều đó tùy thuộc vào trường hợp sử dụng của bạn.

+3

Nhưng bạn phải thiết lập lại các bản ghi mongo để nó hoạt động. –

14

Để kiểm tra kết nối trong một vòng lặp như bạn đề nghị,

until nc -z localhost 27017 
do 
    sleep 1 
done 
+0

tog ... tôi đã cố gắng đề xuất của bạn nhưng điều đó không hoạt động. bất kỳ ý tưởng nào khác? –

+6

Phản hồi không hợp lệ: "Nó không hoạt động". Phản hồi tốt: "Tôi đã thử các lệnh đúng nguyên văn, và nó chỉ chờ đợi mãi mãi. Tôi đã kiểm tra stdout/stderr và nó giữ in 'bash: nc: lệnh không tìm thấy'. Làm thế nào tôi có thể giải quyết vấn đề này?" hoặc "Tôi đã thử điều này, và nó chờ đợi mãi mãi. Tuy nhiên, cơ sở dữ liệu là lên và chấp nhận các kết nối, và netstat cho thấy nó nghe:' tcp 0 192.168.1.17:27017 0.0.0.0:* LISTEN'. Vấn đề có thể là gì? " (trong những trường hợp này, bạn sẽ cài đặt netcat hoặc kết nối bằng lan ip thay vì localhost tương ứng) –

+0

lời xin lỗi của tôi cho một câu trả lời vội vàng. tôi đã thử mệnh lệnh và nó được chứng minh là một vòng lặp vô hạn. tức là bất kể trạng thái của quá trình mongod là gì, vòng lặp vẫn tiếp tục chạy. –

1

Trong khi câu trả lời của Tom sẽ hoạt động khá tốt trong hầu hết các trường hợp, nó có thể thất bại nếu bạn đang chạy tập lệnh của mình với cờ -e. Ý tôi là bạn chạy tập lệnh của mình với số set -e ở trên cùng. Tại sao? Bởi vì câu trả lời của Tom dựa vào trạng thái thoát của lệnh trước đó, trong trường hợp này grep -q sẽ thất bại nếu nó không tìm thấy chuỗi cần thiết, và do đó toàn bộ tập lệnh sẽ thất bại. Các tài liệu -e cờ đưa ra một đầu mối về cách để tránh vấn đề này:

Vỏ không thoát nếu lệnh thất bại là một phần của danh sách lệnh ngay sau một thời gian hoặc cho đến khi từ khóa, một phần của kiểm tra trong câu lệnh if, một phần của bất kỳ lệnh nào được thực hiện trong một & & hoặc || danh sách ngoại trừ lệnh sau cuối cùng & & hoặc ||, bất kỳ lệnh nào trong đường ống nhưng cuối cùng hoặc nếu trạng thái trả về của lệnh đang được đảo ngược với!

Vì vậy, một giải pháp là làm cho phần lệnh grep trong điều kiện trong khi. Tuy nhiên, vì anh ta đang chạy mongodb với tùy chọn --logappend chuỗi tìm kiếm có thể xuất hiện như là kết quả của lần chạy trước đó.Tôi kết hợp mà câu trả lời anh chàng khác với câu trả lời của Tom và nó hoạt động thực sự tốt:

# Wait until mongo logs that it's ready (or timeout after 60s) 
COUNTER=0 
while !(nc -z localhost 27017) && [[ $COUNTER -lt 60 ]] ; do 
    sleep 2 
    let COUNTER+=2 
    echo "Waiting for mongo to initialize... ($COUNTER seconds so far)" 
done 

tôi thấy rằng việc sử dụng tomcat là giải pháp tốt nhất bởi vì nó thực sự kiểm tra nếu có cái gì đó nghe.

+0

Đây là người chiến thắng. Cảm ơn bạn. – tofutim

1

Giải pháp sử dụng Công cụ MongoDB. Hữu ích trong một container docker hoặc một cái gì đó tương tự, nơi bạn không muốn cài đặt nc.

until mongo --eval "print(\"waited for connection\")" 
    do 
    sleep 60 
    done 

Dựa trên câu trả lời của người khác.

Các vấn đề liên quan