Mongodb:ERROR: child process failed, exited with 1
阿新 • • 發佈:2020-12-08
mongoDB無法啟動的問題
安裝方式:配置yum源,使用yum安裝
問題復現過程:
安裝完畢後,使用systemctl命令啟動
[[email protected] yum.repos.d]# ls /var/lib/mongo/ [[email protected] yum.repos.d]# systemctl start mongod.service [[email protected] yum.repos.d]# ll /var/lib/mongo/ total 64 -rw------- 1 mongod mongod 4096 Dec 7 14:44 collection-0-4384179953892643704.wt -rw------- 1 mongod mongod 4096 Dec 7 14:44 collection-2-4384179953892643704.wt -rw------- 1 mongod mongod 4096 Dec 7 14:44 collection-4-4384179953892643704.wt drwx------ 2 mongod mongod 71 Dec 7 14:44 diagnostic.data -rw------- 1 mongod mongod 4096 Dec 7 14:44 index-1-4384179953892643704.wt -rw------- 1 mongod mongod 4096 Dec 7 14:44 index-3-4384179953892643704.wt -rw------- 1 mongod mongod 4096 Dec 7 14:44 index-5-4384179953892643704.wt -rw------- 1 mongod mongod 4096 Dec 7 14:44 index-6-4384179953892643704.wt drwx------ 2 mongod mongod 110 Dec 7 14:44 journal -rw------- 1 mongod mongod 4096 Dec 7 14:44 _mdb_catalog.wt -rw------- 1 mongod mongod 5 Dec 7 14:44 mongod.lock -rw------- 1 mongod mongod 4096 Dec 7 14:44 sizeStorer.wt -rw------- 1 mongod mongod 114 Dec 7 14:44 storage.bson -rw------- 1 mongod mongod 47 Dec 7 14:44 WiredTiger -rw------- 1 mongod mongod 4096 Dec 7 14:44 WiredTigerHS.wt -rw------- 1 mongod mongod 21 Dec 7 14:44 WiredTiger.lock -rw------- 1 mongod mongod 963 Dec 7 14:44 WiredTiger.turtle -rw------- 1 mongod mongod 4096 Dec 7 14:44 WiredTiger.wt
以上的操作是完全沒有問題的,檢查了資料目錄,發現是服務成功啟動後才會有相應的資料,類似於mysql的資料初始化。注意:資料目錄的每一個檔案的屬主屬組都是mongod。
關閉服務
[[email protected] yum.repos.d]# systemctl stop mongod.service
以上的操作不會造成任何問題,但是當我以mongod命令的方式啟動服務,再關閉服務後,使用systemctl命令的方式啟動,就會無法啟動。
mongod命令啟動
[[email protected] yum.repos.d]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1489
child process started successfully, parent exiting
關閉服務
[[email protected] yum.repos.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 890/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 974/master
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1489/mongod
tcp6 0 0 :::22 :::* LISTEN 890/sshd
tcp6 0 0 ::1:25 :::* LISTEN 974/master
[ [email protected] yum.repos.d]# kill 1489
使用systemctl啟動
[[email protected] yum.repos.d]# systemctl start mongod.service
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.
[[email protected] yum.repos.d]# vim /var/log/messages
Dec 7 14:51:06 node-1 systemd: Starting MongoDB Database Server...
Dec 7 14:51:06 node-1 mongod: about to fork child process, waiting until server is ready for connections.
Dec 7 14:51:06 node-1 mongod: forked process: 1822
Dec 7 14:51:06 node-1 mongod: ERROR: child process failed, exited with 1
Dec 7 14:51:06 node-1 mongod: To see additional information in this output, start without the "--fork" option.
Dec 7 14:51:06 node-1 systemd: mongod.service: control process exited, code=exited status=1
Dec 7 14:51:06 node-1 systemd: Failed to start MongoDB Database Server.
Dec 7 14:51:06 node-1 systemd: Unit mongod.service entered failed state.
Dec 7 14:51:06 node-1 systemd: mongod.service failed.
發現啟動不了了,檢視日誌也沒有明確說是哪裡的問題。
檢查資料目錄
[[email protected] yum.repos.d]# ll /var/lib/mongo/
total 280
-rw------- 1 mongod mongod 32768 Dec 7 14:50 collection-0-4384179953892643704.wt
-rw------- 1 mongod mongod 36864 Dec 7 14:50 collection-2-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec 7 14:44 collection-4-4384179953892643704.wt
drwx------ 2 mongod mongod 216 Dec 7 14:50 diagnostic.data
-rw------- 1 mongod mongod 32768 Dec 7 14:50 index-1-4384179953892643704.wt
-rw------- 1 mongod mongod 36864 Dec 7 14:50 index-3-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec 7 14:44 index-5-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec 7 14:50 index-6-4384179953892643704.wt
drwx------ 2 mongod mongod 110 Dec 7 14:50 journal
-rw------- 1 mongod mongod 32768 Dec 7 14:50 _mdb_catalog.wt
-rw------- 1 mongod mongod 0 Dec 7 14:50 mongod.lock
-rw------- 1 mongod mongod 36864 Dec 7 14:50 sizeStorer.wt
-rw------- 1 mongod mongod 114 Dec 7 14:44 storage.bson
-rw------- 1 mongod mongod 47 Dec 7 14:44 WiredTiger
-rw------- 1 mongod mongod 4096 Dec 7 14:50 WiredTigerHS.wt
-rw------- 1 mongod mongod 21 Dec 7 14:44 WiredTiger.lock
-rw------- 1 root root 1247 Dec 7 14:50 WiredTiger.turtle
-rw------- 1 mongod mongod 45056 Dec 7 14:50 WiredTiger.wt
發現有一個檔案的屬主屬組變成了root,很有可能就是因為無法讀取這個檔案導致使用systemctl命令啟動不了服務。
修改屬主屬組
[[email protected] yum.repos.d]# chown -R mongod.mongod /var/lib/mongo/
再次啟動
[[email protected] yum.repos.d]# systemctl start mongod
[[email protected] yum.repos.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 890/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 974/master
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1679/mongod
tcp6 0 0 :::22 :::* LISTEN 890/sshd
tcp6 0 0 ::1:25
原因分析
首先,在使用mongoDB的過程中,儘量不要使用kill命令去操作,要以正常的方式結束mongodb的程序,否則大概率會出現無法啟動服務的問題。
其次,出現上述的問題,並不是kill導致的問題,而是啟動服務身份發生改變的問題。使用mongod命令啟動服務,由於當前我是root使用者,所以啟動過程中所建立的檔案的屬主屬組都會是root,當我使用systemctl命令啟動時,由於mongod.service檔案指定了啟動服務的使用者,所以將會變成mongod使用者來啟動服務,此時就會無法開啟資料目錄的那個檔案,造成服務無法啟動。但其實此時再次用mongod去啟動服務,他是可以起來的,因為是以root的使用者的身份去啟動的。問題就在這。
最後,雖然這次只是因為身份問題導致了服務起不來,但是還是要提醒,生產環境謹慎使用 kill 命令!