Open1
MongoDBのソケットファイルエラーの対処法
sudo service mongod status
× mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2024-06-20 03:27:13 JST; 9s ago
Docs: https://docs.mongodb.org/manual
Process: 629883 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=14)
Main PID: 629883 (code=exited, status=14)
CPU: 38ms
6月 20 03:27:13 jun-desktop systemd[1]: Started MongoDB Database Server.
6月 20 03:27:13 jun-desktop mongod[629883]: {"t":{"$date":"2024-06-19T18:27:13.053Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"-","msg":"Environme>
6月 20 03:27:13 jun-desktop systemd[1]: mongod.service: Main process exited, code=exited, status=14/n/a
6月 20 03:27:13 jun-desktop systemd[1]: mongod.service: Failed with result 'exit-code'.
lines 1-12/12 (END)
sudo tail -n 50 /var/log/mongodb/mongod.log
GPTに聞いてみた
ログから、MongoDBが起動時に「socket file」をアンリンクする操作が許可されていないために失敗していることがわかります。このエラーにより、致命的なアサーションエラーが発生し、MongoDBが起動しない原因となっています。
具体的なエラーメッセージ:
{"t":{"$date":"2024-06-20T03:27:13.097+09:00"},"s":"E", "c":"NETWORK", "id":23024, "ctx":"initandlisten","msg":"Failed to unlink socket file","attr":{"path":"/tmp/mongodb-27017.sock","error":"Operation not permitted"}}
{"t":{"$date":"2024-06-20T03:27:13.098+09:00"},"s":"F", "c":"ASSERT", "id":23091, "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":40486,"file":"src/mongo/transport/transport_layer_asio.cpp","line":1130}}
{"t":{"$date":"2024-06-20T03:27:13.098+09:00"},"s":"F", "c":"ASSERT", "id":23092, "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}
このエラーを解決するための手順は以下の通りです:
-
ソケットファイルの削除:
MongoDBが以前の起動から残っているソケットファイルを削除できないために発生しています。手動でこのファイルを削除してみてください。sudo rm /tmp/mongodb-27017.sock
-
MongoDBの再起動:
ソケットファイルを削除した後、MongoDBを再起動します。sudo service mongod start
これで問題が解決するか確認してください。ソケットファイルの削除が許可されていなかったためにMongoDBが起動できなかった可能性が高いです。この手順で解決できるはずです。
### 直った\(^o^)/
sudo rm /tmp/mongodb-27017.sock
(base) jun@jun-desktop:~/ドキュメント/BBS/Pyserver$ sudo service mongod start
(base) jun@jun-desktop:~/ドキュメント/BBS/Pyserver$ sudo service mongod status
● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2024-06-20 03:37:48 JST; 9s ago
Docs: https://docs.mongodb.org/manual
Main PID: 640580 (mongod)
Memory: 171.2M
CPU: 732ms
CGroup: /system.slice/mongod.service
└─640580 /usr/bin/mongod --config /etc/mongod.conf
6月 20 03:37:48 jun-desktop systemd[1]: Started MongoDB Database Server.
6月 20 03:37:48 jun-desktop mongod[640580]: {"t":{"$date":"2024-06-19T18:37:48.663Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"-","msg":"Environme>
まとめ
原理
MongoDBなどのサーバーアプリケーションは、ネットワーク通信を行うために「ソケットファイル」という特別なファイルを使用します。MongoDBは起動時に /tmp/mongodb-27017.sock
というソケットファイルを作成して、通信を管理します。しかし、サーバーが異常終了したり、手動で強制終了されると、このソケットファイルが削除されずに残ることがあります。
原因
- MongoDBが再起動する際、前回の残されたソケットファイルを見つけ、再作成しようとしますが、削除ができないためにエラー(Operation not permitted)が発生します。
- 結果として、MongoDBはソケットファイルを利用できず、起動が失敗します(エラーステータス14が返されます)。
なぜこれで直るか
- 手動でソケットファイル
/tmp/mongodb-27017.sock
を削除すると、MongoDBが起動する際に新しいソケットファイルを問題なく作成できるようになります。 - 新しいソケットファイルが正常に作成されることで、MongoDBは正しく通信を始めることができ、サーバーは正常に動作します。
要するに、「残っていた古いソケットファイルが削除されなかったために起きた問題」であり、それを手動で削除することで解決したわけでした