Cách dừng mongo DB trong một lệnh


159

Tôi cần có khả năng bắt đầu / dừng MongoDB trên cli. Nó khá đơn giản để bắt đầu:

./mongod

Nhưng để dừng DB mongo, trước tiên tôi cần chạy shell mongo và sau đó gõ hai lệnh:

$ ./mongo

sử dụng quản trị viên

db.shutdownServer ()

Vì vậy, tôi không biết làm thế nào để ngăn chặn DB mongo trong một dòng. Có ai giúp đỡ không?

Câu trả lời:


226

Bắt đầu và dừng MongoDB được trình bày trong hướng dẫn MongoDB. Nó giải thích các tùy chọn khác nhau của việc dừng MongoDB thông qua shell, cli, trình điều khiển, v.v. Nó cũng nêu chi tiết các rủi ro của việc dừng MongoDB không chính xác (như hỏng dữ liệu) và nói về các tín hiệu tiêu diệt khác nhau.

Ngoài ra, nếu bạn đã cài đặt MongoDB bằng trình quản lý gói cho Ubuntu hoặc Debian thì bạn có thể dừng mongodb (hiện tại là mongod trong ubfox) như sau:

  • Mới bắt đầu: sudo service mongod stop

  • Sysvinit: sudo /etc/init.d/mongod stop

Hoặc trên Mac OS X

Hoặc trên các hệ thống dựa trên Red Hat :

  • service mongod stop

Hoặc trên Windows nếu bạn đã cài đặt như một dịch vụ có tên MongoDB:

  • net stop MongoDB

Và nếu không được cài đặt dưới dạng dịch vụ (kể từ Windows 7+), bạn có thể chạy:

  • taskkill /f /im mongod.exe

Để tìm hiểu thêm về các vấn đề của việc tắt máy ô uế, cách tốt nhất để tránh tình huống như vậy và phải làm gì trong trường hợp tắt máy ô uế, vui lòng xem: Khôi phục dữ liệu sau khi tắt máy đột xuất .


5
Tôi tin rằng thứ tự cho dịch vụ là sudo service mongodb [start|stop|restart|status]. sudo service stop mongodbkết quả trong: dừng: dịch vụ không được công nhận
jacob

2
@Jacob - Chúng tôi vừa thử cái này trên Ubuntu, bạn nói đúng, tôi đã chỉnh sửa câu trả lời.
Andrew M

5
Đối với Mac, bạn cũng có thể thực hiện 'killall mongod'. Theo cách đó, bạn không cần phải biết về PID.
Jon M

2
Hoặc trên Mac: 'ps -ax | grep mongod ', sau đó giết số tiến trình
Bryan Grace

1
Trong Ubuntu 18.04 mới, tôi có thể dừng nó bằng cách sử dụng> dịch vụ sudo mongod stop ... không phải "mongodb"
Naseef Ummer

101

Nếu bạn thực sự muốn một dòng tương đương với các lệnh trong câu hỏi ban đầu của bạn, bạn có thể bí danh:

mongo --eval "db.getSiblingDB('admin').shutdownServer()"

Câu trả lời của Mark về việc bắt đầu và dừng MongoDB thông qua các dịch vụ là cách tiếp cận quản trị điển hình (và được khuyến nghị).


3
Câu trả lời chính xác. Khi thiết lập nhiều phiên bản trên máy phát triển (thử bộ sao chép trước khi triển khai), nó sẽ giúp có một .bat start C:\mongodb\bin\mongod.exe --config C:\net2\primary1-pc\mongod.cfg start C:\mongodb\bin\mongod.exe --config C:\net2\secondary1-pc\mongod.cfg ... và sau đó tắt C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27017 C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27018 C:\mongodb\bin\mongo.exe --eval "db.getSiblingDB('admin').shutdownServer()" --port 27019 ...
máy.bat

2
Trên Windows nơi nó được cài đặt như một dịch vụ, tôi thấy điều đó net stop MongoDBkhông đáng tin cậy, vì vậy tôi đã sử dụng một cái gì đó tương tự : mongo admin --eval "db.shutdownServer()". Chúc mừng!
NateJ

1
@Stennie Khi tôi sử dụng 'net stop MongoDB' trên các cửa sổ, nó đang hiển thị "Lỗi hệ thống 1067 đã xảy ra"
charan tej

48

mongod --dbpath /path/to/your/db --shutdown

Thông tin thêm tại chính thức: http://docs.mongodb.org/manual/tutorial/manage-mongodb- Processes /


Tôi thích sử dụng cách này, nó cũng hoạt động mà không có dbpath, có ý nghĩa nếu bạn chỉ có một phiên bản đang chạy.
radtek

2
có vẻ như nó không hoạt động cho các phiên bản mới hơn, từ 2.4.xx đến mới nhất.
alexserver

Đây là câu trả lời duy nhất mà tôi thấy rằng thực sự có hiệu quả.
David Betz

6
MacOS 10.12, mongod v3.4.10: Error parsing command line: unrecognised option '--shutdown':-(
t0r0X

Có một hành vi được xác định cho điều này nếu nó được chạy trên một bản chính của một bộ bản sao? Nó dường như hành xử như thế db.shutdownServer({force:1,timeoutSecs:0})sẽ ức chế việc xóa các dữ liệu còn lại cho người thứ hai. Bạn có thể không luôn luôn muốn điều đó.
Daniel F

30

Nếu máy chủ đang chạy như là quá trình tiền cảnh trong một thiết bị đầu cuối, điều này có thể được thực hiện bằng cách nhấn

Ctrl-C

Một cách khác để tắt sạch máy chủ đang chạy là sử dụng lệnh tắt máy,

> use admin
> db.shutdownServer();

Nếu không, một lệnh như kill có thể được sử dụng để gửi tín hiệu. Nếu mongod có 10014 là PID của nó, lệnh sẽ là

kill -2 10014

3
Sử dụng kill không phải là một ý tưởng hay, điều này có thể dẫn đến DB bị hỏng, cần sửa chữa để khởi động lại. "Không bao giờ sử dụng kill -9 (tức là SIGKILL) để chấm dứt một cá thể mongod." Tài liệu: docs.mongodb.org/manual/tutorial/manage-mongodb- Processes / từ
Jens A. Koch

7
@ JensA.Koch Ya, Nanhe đã không nói cho ai sử dụng tín hiệu -9, vì vậy .. nói rằng "sử dụng kill không phải là một ý tưởng hay" đơn giản là không chính xác. Chỉ chấm dứt ngay lập tức là không an toàn - giết bình thường là hoàn toàn an toàn và tài liệu bạn liên kết để ủng hộ nó.
BT

18

Tôi đã làm theo tài liệu MongoDB chính thức để dừng lại với các tín hiệu. Một trong những lệnh sau đây có thể được sử dụng (PID đại diện Process IDcủa mongodquá trình):

kill PID

gửi tín hiệu 15 (SIGTERM) hoặc

kill -2 PID

gửi tín hiệu 2 (SIGINT).

Cảnh báo từ tài liệu MongoDB :
Không bao giờ sử dụng kill -9(ví dụ SIGKILL) để chấm dứt một mongodthể hiện.

Nếu bạn có nhiều hơn một phiên bản đang chạy hoặc bạn không quan tâm đến PID, bạn có thể sử dụng pkillđể gửi tín hiệu đến tất cả các mongodquy trình đang chạy :

pkill mongod

hoặc là

pkill -2 mongod

hoặc, an toàn hơn nhiều, chỉ với các quy trình thuộc về bạn:

pkill -U $USER mongod

hoặc là

pkill -2 -U $USER mongod

PS
Lưu ý: Tôi đã sử dụng tùy chọn này, bởi vì mongod --shutdown, mặc dù được đề cập trong tài liệu MongoDB hiện tại , nhưng tò mò không hoạt động trên máy của tôi (macOS, mongodb v3.4.10, được cài đặt homebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(cụ thể về macOS) Trước khi có ai thắc mắc: không, tôi không thể dừng nó bằng lệnh
brew services stop mongodb
vì tôi đã không bắt đầu bằng
brew services start mongodb.
Tôi đã bắt đầu mongodvới một dòng lệnh tùy chỉnh :-)


Câu trả lời tuyệt vời, đã xác nhận rằng MongoDB có thể được kết thúc một cách duyên dáng bằng tín hiệu SIGTERM. Điều quan trọng là nếu chạy MongoDB trong Docker - docs.docker.com/compose/compose-file/#stop_grace_apse . Lưu ý thêm rằng cần phải sử dụng CMD ["mongod", "tùy chọn", "tùy chọn"] để đảm bảo MongoDB có được PID 1, sau đó tín hiệu được gửi bởi Docker sẽ đến DB của bạn.
laimison

9

Sử dụng mongod --shutdown

Theo tài liệu chính thức: Manage-mongodb-process /

: D


Đây là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều.
Gaurav Sharma

Không thể giết tiến trình: errno: 1 Thao tác không được phép.
htm11h


Đây là những gì chỉ làm việc cho tôi. Tôi không có mongod là dịch vụ và lệnh start đã hiển thị lỗi là một phiên bản của mongod đang chạy. Cảm ơn một tấn, người đàn ông!
Sanjeet A

8

Trường hợp đặc biệt của tôi là:

trước đây bắt đầu mongod bởi:

sudo -u mongod mongod -f /etc/mongod.conf

Bây giờ, muốn dừng lại mongod.

và tham khảo tài liệu chính thức Dừng quá trình mongod , đã thử:

(1) shutdownServernhưng không thành công:

> use admin
switched to db admin
> db.shutdownServer()
2019-03-06T14:13:15.334+0800 E QUERY    [thread1] Error: shutdownServer failed: {
        "ok" : 0,
        "errmsg" : "shutdown must run from localhost when running db without auth",
        "code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.shutdownServer@src/mongo/shell/db.js:302:1
@(shell):1:1

(2) --shutdownvẫn thất bại:

# mongod --shutdown
There doesn't seem to be a server running with dbpath: /data/db

(3) lệnh bắt đầu trước đó thêm --shutdown:

sudo -u mongod mongod -f /etc/mongod.conf --shutdown
killing process with pid: 30213
failed to kill process: errno:1 Operation not permitted

(4) sử dụng serviceđể dừng:

service mongod stop

service mongod status

hiển thị dự kiến Active: inactive (dead)nhưng mongodthực sự vẫn đang chạy, vì có thể thấy quá trình từ ps:

# ps -edaf | grep mongo | grep -v grep
root     30213     1  0 Feb04 ?        03:33:22 mongod --port PORT --dbpath=/var/lib/mongo

cuối cùng , thực sự dừng mongod bằng cách:

# sudo mongod -f /etc/mongod.conf --shutdown
killing process with pid: 30213

Cho đến bây giờ, nguyên nhân gốc rễ: vẫn chưa biết ...

hy vọng giải pháp trên là hữu ích cho bạn.


6

tạo một tập tin gọi là mongostop.bat

lưu mã sau đây

 mongo admin --eval "db.shutdownServer()"

chạy tệp mongostop.bat và bạn đã dừng mongo thành công


4

Một lớp lót để bắt đầu hoặc dừng dịch vụ mongodb bằng dòng lệnh;

  1. Để bắt đầu sử dụng dịch vụ: NET START MONGODB
  2. Để dừng sử dụng dịch vụ: NET STOP MONGODB

Tôi sử dụng bản thân mình, nó làm việc.


Tôi nhận được điều này khi sử dụng các lệnh đó trên windows: c: \ mongodb \ bin> NET START MONGODB Tên dịch vụ không hợp lệ. Có thêm trợ giúp bằng cách nhập NET HELPMSG 2185. c: \ mongodb \ bin> NET STOP MONGODB Tên dịch vụ không hợp lệ. Có thêm trợ giúp bằng cách nhập NET HELPMSG 2185.

Trên cửa sổ, trước tiên bạn phải cài đặt mongodb dưới dạng dịch vụ bằng tùy chọn --install. Các lệnh bạn có thể sử dụng một lệnh tương tự như sau để cài đặt nó như một dịch vụ. mongod --install --directoryperdb --dbpath C: \ mongodb-win32-x86_64-2.4.6 \ data --logpath C: \ mongodb-win32-x86_64-2.4.6 \ log \ mongodb.log --logappend - phần còn lại Lệnh trên phải được chạy với quyền quản trị viên. Sau đó, bạn có thể sử dụng các lệnh net start và net stop do Hugo cung cấp.
Ed Ost

3

Từ các lệnh đã cho, tôi nghĩ bạn đang dùng Linux.

Bắt đầu MongoDB:

$ sudo service mongod start
mongod start/running, process XXXXX 

Kiểm tra trạng thái:

$ sudo service mongod status
mongod start/running, process XXXXX 

Dừng MongoDB:

$ sudo service mongod stop
mongod stop/waiting 

2

Dựa trên câu trả lời từ stennie:

mongo --eval "db.getSiblingDB('admin').shutdownServer();quit()"

Tôi thấy rằng mongo đã cố gắng kết nối lại với db sau khi máy chủ tắt, điều này sẽ gây ra sự chậm trễ và thông báo lỗi. Thêm thoát () sau khi tắt máy sẽ tăng tốc và giảm các tin nhắn, nhưng vẫn còn một tin nhắn.

Tôi cũng muốn thêm ngữ cảnh - Tôi đang bắt đầu và dừng mongod như một phần của các trường hợp thử nghiệm cho mã khác, vì vậy đăng ký làm dịch vụ không phù hợp với trường hợp sử dụng. Tôi hy vọng kết thúc với một cái gì đó chạy trên tất cả các nền tảng (điều này đã được thử nghiệm trong các cửa sổ ngay bây giờ). Tôi đang sử dụng mongod 3.6.9


1

Tôi chỉ đơn giản là đã làm:

quit();

Xin lưu ý rằng tôi đang sử dụng mongo 3.0.

Mongo


Nếu bạn đang chạy trong VM, lệnh đó sẽ chỉ dừng VM.
htm11h

1

trong cửa sổ terminal trên mac của bạn, nhấn control + c


Ai đó đã đánh giá thấp điều này. Trên thực tế, đó là một trong những cách để ngăn chặn mongo theo tài liệu mongo. Trong phần lớn các tình huống, điều này sẽ không hoạt động, vì mongo nên chạy trong thiết bị đầu cuối đó và không ở chế độ nền hoặc như một con quỷ, nhưng "đôi khi" giải pháp này sẽ hoạt động. Khi hạ cấp, thật tốt để giải thích lý do
TanisDLJ

1

Sử dụng homebrew (cách được đề xuất):

Để bắt đầu:

brew services start mongodb-community

Dừng lại:

brew services stop mongodb-community


0

Tôi sử dụng tập lệnh khởi động này trên Ubuntu.

#!/bin/sh

### BEGIN INIT INFO
# Provides:     mongodb
# Required-Sart:
# Required-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description: mongodb
# Description: mongo db server
### END INIT INFO

. /lib/lsb/init-functions

PROGRAM=/opt/mongo/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
  start)
     log_begin_msg "Starting MongoDB server"
         ulimit -v unlimited.
         ulimit -n 100000
     /opt/mongo/bin/mongod --fork --quiet --dbpath /data/db --bind_ip 127.0.0.1 --rest   --config /etc/mongod.conf.
     log_end_msg 0
     ;;
  stop)
     log_begin_msg "Stopping MongoDB server"
     if [ ! -z "$MONGOPID" ]; then
kill -15 $MONGOPID
     fi
     log_end_msg 0
     ;;
  status)
     ;;
  *)
     log_success_msg "Usage: /etc/init.d/mongodb {start|stop|status}"
     exit 1
esac

exit 0

2
Vì vậy, bạn chỉ cần giết mongoDB trực tiếp, phải không? Tôi là người mới bắt đầu MongoDB, có đau đớn gì khi giết nó không? Tôi biết đối với SQLServer hoặc Oracle, họ sẽ gặp vấn đề nếu chúng ta giết chúng.
XiaoYao

để giết là -9 nhưng -15 u gửi TÍN HIỆU.
Boris Ivanov

0

các cửa sổ

Trong PowerShell, đó là: Stop-Service MongoDB

Sau đó, để bắt đầu lại: Start-Service MongoDB

Để xác minh xem nó đã bắt đầu chưa, hãy chạy : net start | findstr MongoDB.

Lưu ý: Trên giả định MongoDB được đăng ký như một dịch vụ .


0

Vui lòng tận dụng Trình quản lý tác vụ do HĐH của bạn cung cấp để có giải pháp nhanh chóng và dễ dàng. Dưới đây là màn hình từ / cho Windows 10. Nhấp chuột phải vào quá trình được tô sáng và chọn dừng . Chọn bắt đầu , nếu đã dừng.

nhập mô tả hình ảnh ở đây

Xin lưu ý: Trong nội bộ các lệnh đang thực hiện tương tự như bạn phải thực hiện thủ công bằng GUI (Trình quản lý tác vụ), được cung cấp bởi Windows / HĐH của bạn. Mặc dù, cách tiếp cận này được sử dụng cho mục đích học tập / thực hành để bắt đầu và bạn sẽ không bị chặn do điều này.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.