วิธีหยุด Mongo DB ในคำสั่งเดียว


159

ฉันต้องสามารถเริ่ม / หยุด MongoDB บน ​​CLI ได้ มันค่อนข้างง่ายในการเริ่มต้น:

./mongod

แต่เพื่อหยุด Mongo DB ฉันต้องรัน open mongo shell ก่อนแล้วจึงพิมพ์สองคำสั่ง:

$ ./mongo

ใช้ผู้ดูแลระบบ

db.shutdownServer ()

ดังนั้นฉันไม่รู้จะหยุด Mongo DB ในหนึ่งบรรทัดได้อย่างไร ความช่วยเหลือใด ๆ

คำตอบ:


226

การเริ่มต้นและการหยุด MongoDBครอบคลุมอยู่ในคู่มือ MongoDB มันอธิบายตัวเลือกต่าง ๆ ของการหยุด MongoDB ผ่านเชลล์, cli, ไดรเวอร์เป็นต้นนอกจากนี้ยังมีรายละเอียดความเสี่ยงของการหยุด MongoDB (เช่นข้อมูลเสียหาย) อย่างไม่ถูกต้องและพูดคุยเกี่ยวกับสัญญาณการฆ่าที่แตกต่างกัน

นอกจากนี้หากคุณติดตั้ง MongoDB โดยใช้ตัวจัดการแพ็คเกจสำหรับUbuntuหรือDebianคุณสามารถหยุด mongodb (ปัจจุบันคือ mongod ใน ubuntu) ดังต่อไปนี้:

  • พุ่งพรวด: sudo service mongod stop

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

หรือบนMac OS X

หรือบนระบบที่ใช้Red Hat :

  • service mongod stop

หรือบนWindowsหากคุณติดตั้งเป็นบริการชื่อMongoDB:

  • net stop MongoDB

และหากไม่ได้ติดตั้งเป็นบริการ (เช่น Windows 7+) คุณสามารถเรียกใช้:

  • taskkill /f /im mongod.exe

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับปัญหาของการปิดระบบที่ไม่สะอาดวิธีการหลีกเลี่ยงที่ดีที่สุดสถานการณ์ดังกล่าวและจะทำอย่างไรในกรณีที่มีการปิดไม่สะอาดโปรดดูที่: กู้คืนข้อมูลหลังจากที่ปิดไม่คาดคิด


5
sudo service mongodb [start|stop|restart|status]ผมเชื่อว่าเพื่อให้การบริการที่เป็น sudo service stop mongodbผลลัพธ์ใน: หยุด: บริการที่ไม่รู้จัก
jacob

2
@Jacob - เราเพิ่งลองสิ่งนี้บน Ubuntu คุณพูดถูกฉันได้แก้ไขคำตอบแล้ว
Andrew M

5
สำหรับ Mac คุณสามารถทำ 'killall mongod' ได้เช่นกัน ด้วยวิธีนี้คุณไม่จำเป็นต้องรู้ PID
Jon M

2
หรือบน Mac: 'ps -ax | grep mongod 'จากนั้นจึงฆ่าหมายเลขกระบวนการ
Bryan Grace

1
ใน Ubuntu 18.04 ใหม่ฉันสามารถหยุดได้โดยใช้> sudo service mongod หยุด ... ไม่ใช่ "mongodb"
Naseef Ummer

101

หากคุณต้องการหนึ่งบรรทัดเทียบเท่ากับคำสั่งในคำถามดั้งเดิมของคุณคุณสามารถใช้นามแฝง:

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

คำตอบของมาร์คในการเริ่มต้นและหยุด MongoDB ผ่านบริการเป็นวิธีการจัดการทั่วไป (และแนะนำ)


3
คำตอบที่ดี เมื่อตั้งค่าหลายอินสแตนซ์บนเครื่องพัฒนา (ลองชุดการจำลองแบบก่อนการปรับใช้) จะช่วยให้มี. 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 ... แล้วมี shutdown.bat 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 ...
Developer Marius Žilėnas

2
บน Windows ที่ติดตั้งเป็นบริการฉันพบว่าnet stop MongoDBไม่น่าเชื่อถือดังนั้นฉันจึงใช้สิ่งที่คล้ายกัน: mongo admin --eval "db.shutdownServer()". ไชโย!
NateJ

1
@Stennie เมื่อฉันใช้ 'หยุดสุทธิ MongoDB' บน windows มันมีการแสดง "ข้อผิดพลาดของระบบ 1067 ได้เกิดขึ้น"
Tej จรัญ

48

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

ข้อมูลเพิ่มเติมที่ทางการ: http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/


ฉันชอบใช้วิธีนี้มันทำงานได้โดยไม่ต้อง dbpath เช่นกันทำให้รู้สึกถ้าคุณมีเพียงหนึ่งตัวอย่างที่ทำงาน
radtek

2
ดูเหมือนว่าจะไม่ทำงานสำหรับรุ่นที่ใหม่กว่าจาก 2.4.xx เป็นรุ่นล่าสุด
alexserver

นี่เป็นคำตอบเดียวที่ฉันเห็นว่าใช้งานได้จริง
David Betz

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

มีพฤติกรรมที่กำหนดไว้สำหรับสิ่งนี้หรือไม่ถ้ามันถูกเรียกใช้บนชุดหลักของชุดเรพลิกา? ดูเหมือนว่าจะทำตัวเหมือนdb.shutdownServer({force:1,timeoutSecs:0})ที่จะยับยั้งการล้างข้อมูลที่เหลือไปยังตัวที่สอง คุณอาจไม่ต้องการสิ่งนั้นเสมอไป
Daniel F

30

หากเซิร์ฟเวอร์ทำงานเป็นกระบวนการพื้นหน้าในเทอร์มินัลสามารถทำได้โดยการกด

Ctrl-C

อีกวิธีในการปิดเซิร์ฟเวอร์ที่กำลังทำงานอย่างหมดจดคือการใช้คำสั่ง shutdown

> use admin
> db.shutdownServer();

มิฉะนั้นคำสั่งเช่นฆ่าสามารถใช้ในการส่งสัญญาณ หาก mongod มี 1,001 เป็น PID คำสั่งจะเป็น

kill -2 10014

3
การใช้ kill ไม่ใช่ความคิดที่ดีนี่อาจนำไปสู่ ​​DB ที่เสียหายซึ่งต้องมีการซ่อมแซมเพื่อเริ่มต้นใหม่ "อย่าใช้ kill -9 (เช่น SIGKILL) เพื่อยุติอินสแตนซ์ Mongo" เอกสาร: docs.mongodb.org/manual/tutorial/manage-mongodb-processes/ …
Jens A. Koch

7
@ JensA.Koch Ya, Nanhe ไม่ได้บอกใครให้ใช้สัญญาณ -9 ดังนั้น .. การพูดว่า "การฆ่าโดยใช้ไม่ใช่ความคิดที่ดี" ก็ไม่ถูกต้อง การเลิกจ้างในทันทีนั้นไม่ปลอดภัย - การฆ่าปกตินั้นปลอดภัยอย่างสมบูรณ์และเอกสารที่คุณเชื่อมโยงเพื่อสนับสนุนมัน
BT

18

ฉันติดตามเอกสารอย่างเป็นทางการของMongoDBเพื่อหยุดสัญญาณ หนึ่งในคำสั่งดังต่อไปนี้สามารถนำมาใช้ (PID หมายถึงProcess IDของmongodกระบวนการ):

kill PID

ซึ่งส่งสัญญาณ 15 (SIGTERM) หรือ

kill -2 PID

ซึ่งส่งสัญญาณ 2 (SIGINT)

คำเตือนจากเอกสาร MongoDB :
ห้ามใช้kill -9(เช่น SIGKILL) เพื่อยุติmongodอินสแตนซ์

หากคุณมีอินสแตนซ์มากกว่าหนึ่งตัวที่กำลังทำงานอยู่หรือคุณไม่สนใจ PID คุณสามารถใช้pkillเพื่อส่งสัญญาณไปยังmongodกระบวนการที่กำลังทำงานอยู่ทั้งหมด:

pkill mongod

หรือ

pkill -2 mongod

หรือปลอดภัยยิ่งขึ้นต่อกระบวนการของคุณ:

pkill -U $USER mongod

หรือ

pkill -2 -U $USER mongod


หมายเหตุPS : ฉันหันไปใช้ตัวเลือกนี้เพราะmongod --shutdownถึงแม้ว่าจะกล่าวถึงในเอกสาร MongoDBในปัจจุบันแต่ก็ไม่ได้ทำงานบนเครื่องของฉัน (macOS, mongodb v3.4.10, ติดตั้งด้วยhomebrew):
Error parsing command line: unrecognised option '--shutdown'

PPS
(MacOS เฉพาะ) ก่อนที่ทุกคนมหัศจรรย์: ไม่ฉันไม่สามารถหยุดมันได้ด้วยคำสั่งเพราะผมไม่ได้เริ่มต้นด้วย
brew services stop mongodb
ฉันเริ่มต้นด้วยบรรทัดคำสั่งที่กำหนดเอง :-)
brew services start mongodb
mongod


คำตอบที่ยอดเยี่ยมซึ่งยืนยันว่า MongoDB สามารถสิ้นสุดได้อย่างงดงามโดยใช้สัญญาณ SIGTERM มันเป็นสิ่งสำคัญถ้าทำงาน MongoDB ในหาง - docs.docker.com/compose/compose-file/#stop_grace_period โปรดทราบว่าจะต้องใช้ CMD ["mongod", "option", "option"] เพื่อให้แน่ใจว่า MongoDB ได้รับ PID 1 จากนั้นสัญญาณที่ส่งโดย Docker จะไปถึงฐานข้อมูลของคุณ
laimison

9

ใช้ mongod --shutdown

ตามเอกสารอย่างเป็นทางการ: Manage-mongodb-processes /

: D


นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณมาก.
Gaurav Sharma

ไม่สามารถฆ่ากระบวนการ: errno: 1 ไม่อนุญาตการดำเนินการ
htm11h


สิ่งนี้ใช้ได้ผลกับฉันเท่านั้น ฉันไม่มี mongod เป็นบริการและคำสั่งเริ่มต้นแสดงข้อผิดพลาดเป็นตัวอย่างของ mongod กำลังทำงานอยู่ ขอบคุณตันคน!
Sanjeet

8

กรณีพิเศษของฉันคือ:

ก่อนหน้านี้เริ่ม mongod โดย:

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

mongodตอนนี้ต้องการที่จะหยุด

และอ้างอิง doc doc mongodอย่างเป็นทางการได้ลอง:

(1) shutdownServerแต่ล้มเหลว:

> 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) --shutdownยังคงล้มเหลว:

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

(3) คำสั่งเริ่มต้นก่อนหน้าเพิ่ม --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) ใช้serviceเพื่อหยุด:

service mongod stop

และ

service mongod status

แสดงคาดว่าActive: inactive (dead)แต่mongodที่จริงยังคงทำงานเพื่อสามารถเห็นกระบวนการจาก PS:

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

และสุดท้ายหยุด mongod จริงๆโดย:

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

จนถึงตอนนี้สาเหตุที่แท้จริง: ยังไม่ทราบ ...

ความหวังการแก้ปัญหาข้างต้นมีประโยชน์สำหรับคุณ


6

สร้างไฟล์ชื่อ mongostop.bat

บันทึกรหัสต่อไปนี้ในนั้น

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

เรียกใช้ไฟล์ mongostop.bat และคุณประสบความสำเร็จในการหยุด mongo


4

หนึ่ง liners เพื่อเริ่มหรือหยุดบริการ mongodb โดยใช้บรรทัดคำสั่ง

  1. ในการเริ่มใช้บริการ: NET START MONGODB
  2. หากต้องการหยุดการใช้บริการ: NET STOP MONGODB

ฉันใช้มันเองมันใช้งานได้


ฉันได้รับสิ่งนี้ในการใช้คำสั่งเหล่านั้นบน windows: C: \ mongodb \ bin> MONGODB เริ่มต้นสุทธิชื่อบริการไม่ถูกต้อง ความช่วยเหลือเพิ่มเติมพร้อมใช้งานโดยการพิมพ์ NET HELPMSG 2185 c: \ mongodb \ bin> NET STOP MONGODB ชื่อบริการไม่ถูกต้อง ความช่วยเหลือเพิ่มเติมมีให้โดยการพิมพ์ NET HELPMSG 2185

บน windows คุณต้องติดตั้ง mongodb เป็นบริการโดยใช้ตัวเลือก - ติดตั้ง คำสั่งที่คุณสามารถใช้คำสั่งที่คล้ายกับคำสั่งต่อไปนี้เพื่อติดตั้งเป็นบริการ mongod - ติดตั้ง - directoryperdb - dbpath C: \ mongodb-win32-x86_64-2.4.6 \ data - logpath C: \ mongodb-win32-x86_64-2.4.6 \ log \ mongodb.log - logappend - ส่วนที่เหลือคำสั่งข้างต้นจะต้องทำงานด้วยสิทธิ์ผู้ดูแลระบบ หลังจากนั้นคุณสามารถใช้คำสั่ง net start และ net stop ที่จัดทำโดย Hugo
Ed Ost

3

จากคำสั่งที่กำหนดฉันคิดว่าคุณอยู่บน Linux

เริ่ม MongoDB:

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

ตรวจสอบสถานะ:

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

หยุด MongoDB:

$ sudo service mongod stop
mongod stop/waiting 

2

สร้างคำตอบจาก stennie:

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

ฉันพบว่า mongo กำลังพยายามเชื่อมต่อกับ db อีกครั้งหลังจากเซิร์ฟเวอร์ปิดตัวลงซึ่งจะทำให้เกิดความล่าช้าและข้อความแสดงข้อผิดพลาด การเพิ่มเลิก () หลังจากปิดระบบจะเพิ่มความเร็วและลดข้อความ แต่ยังคงมีอยู่

ฉันยังต้องการเพิ่มบริบท - ฉันเริ่มต้นและหยุด mongod เป็นส่วนหนึ่งของกรณีทดสอบสำหรับรหัสอื่น ๆ ดังนั้นการลงทะเบียนเป็นบริการไม่เหมาะกับกรณีการใช้งาน ฉันหวังว่าจะจบลงด้วยสิ่งที่ทำงานบนแพลตฟอร์มทั้งหมด (นี้ทดสอบใน windows ตอนนี้) ฉันใช้ mongod 3.6.9



1

ในหน้าต่างเทอร์มินัลบน mac ของคุณกด control + c


มีคนลงคะแนนนี้ ในความเป็นจริงแล้วมันเป็นวิธีหนึ่งในการหยุด mongo ตามเอกสารของ mongo ในสถานการณ์ส่วนใหญ่สิ่งนี้จะไม่ทำงานเนื่องจาก mongo ควรทำงานในเทอร์มินัลนั้นและไม่อยู่ในพื้นหลังหรือเป็นปีศาจ แต่ "บางครั้ง" วิธีนี้จะใช้งานได้ เมื่อ downvoting มันเป็นเรื่องดีที่จะอธิบายว่าทำไม
TanisDLJ

1

ใช้ homebrew (วิธีที่แนะนำ):

เริ่ม:

brew services start mongodb-community

หากต้องการหยุด:

brew services stop mongodb-community


0

ฉันใช้สคริปต์เริ่มต้นนี้บน 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
ดังนั้นคุณแค่ฆ่า mongoDB โดยตรงใช่มั้ย ฉันเป็นผู้เริ่มต้นของ MongoDB มีใครเจ็บไหมที่จะฆ่ามัน? ฉันรู้สำหรับ SQLServer หรือ Oracle พวกเขาจะพบปัญหาหากเราเพิ่งฆ่าพวกเขา
XiaoYao

to kill is -9 แต่ -15 u ส่ง SIGNAL
Boris Ivanov

0

ของ windows

ใน PowerShell คือ: Stop-Service MongoDB

จากนั้นเริ่มใหม่อีกครั้ง: Start-Service MongoDB

net start | findstr MongoDBหากต้องการตรวจสอบไม่ว่าจะเริ่มต้นทำงาน:

หมายเหตุ: สูงกว่าถือว่าMongoDB มีการลงทะเบียนเป็นบริการ


0

โปรดใช้ประโยชน์จากตัวจัดการงานที่จัดทำโดยระบบปฏิบัติการของคุณสำหรับวิธีแก้ปัญหาที่ง่ายและรวดเร็ว ด้านล่างเป็น Screengrab จาก / สำหรับ Windows 10. คลิกขวาที่กระบวนการเน้นและเลือกหยุด เลือกเริ่มถ้าหยุดแล้ว

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบ: ภายในคำสั่งต่างกำลังทำสิ่งเดียวกันกับที่คุณต้องทำด้วยตนเองโดยใช้ GUI (ตัวจัดการงาน) ที่ได้รับจาก Windows / ระบบปฏิบัติการ แม้ว่าวิธีนี้จะใช้สำหรับการศึกษา / ฝึกหัดเพื่อเริ่มต้นและคุณจะไม่ถูกบล็อกเนื่องจากสิ่งนี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.