Open1

MongoDBのソケットファイルエラーの対処法

junjun
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"}

このエラーを解決するための手順は以下の通りです:

  1. ソケットファイルの削除:
    MongoDBが以前の起動から残っているソケットファイルを削除できないために発生しています。手動でこのファイルを削除してみてください。

    sudo rm /tmp/mongodb-27017.sock
    
  2. 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が返されます)。

なぜこれで直るか

  1. 手動でソケットファイル /tmp/mongodb-27017.sock を削除すると、MongoDBが起動する際に新しいソケットファイルを問題なく作成できるようになります。
  2. 新しいソケットファイルが正常に作成されることで、MongoDBは正しく通信を始めることができ、サーバーは正常に動作します。

要するに、「残っていた古いソケットファイルが削除されなかったために起きた問題」であり、それを手動で削除することで解決したわけでした