-
-
Save jwilm/5842956 to your computer and use it in GitHub Desktop.
[Unit] | |
Description=MongoDB Database Service | |
Wants=network.target | |
After=network.target | |
[Service] | |
Type=forking | |
PIDFile=/var/run/mongodb/mongod.pid | |
ExecStart=/usr/local/bin/mongod --config /etc/mongod.conf | |
ExecReload=/bin/kill -HUP $MAINPID | |
Restart=always | |
User=mongodb | |
Group=mongodb | |
StandardOutput=syslog | |
StandardError=syslog | |
[Install] | |
WantedBy=multi-user.target | |
I stumbled upon this gist googling for mongod systemd service config. And this is not really working properly for Ubuntu 16.
Assuming following mongod.conf
:
storage:
dbPath: "/var/lib/mongodb"
journal:
enabled: true
net:
port: 27017
bindIp: "127.0.0.1"
You want something like this:
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target
[Service]
Type=simple
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/lib/mongod
ExecStartPre=/bin/chown mongodb:mongodb /var/lib/mongod
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
[Install]
WantedBy=multi-user.target
This ensures:
/var/lib/mongodb
exists and mongod is allowed to write there- mongod is started with proper privileges
- mongod does not fork and is properly monitored and maintained by systemd
- reload is supported
@Genda1ph works for Ubuntu 17.10
If you have services that depend on mongodb, the config is slightly more difficult because the default mongodb service returns before the database is online. That can cause quick applications to try and fail to connect to the database. To prevent this, add the following to /etc/mongod.conf
:
processManagement:
fork: true
Next, create /etc/systemd/system/mongod.service.d/mongod.conf
(which extends the existing /lib/systemd/system/mongod.service
) with the following content:
[Service]
Type=oneshot
RemainAfterExit=yes
That causes sudo systemctl start mongod
to start the server in a forked process and return only AFTER the database is up and ready for connections. This way, dependent services only get invoked after the db is live.
@AlexVonB I've tried your configuration but still having the fast application in trouble. See the time of start of each service:
● mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mongod.service.d
└─mongod.conf
Active: active (exited) since Fri 2019-04-05 19:02:04 CEST; 3min 16s ago
Docs: https://docs.mongodb.org/manual
Process: 1323 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=0/SUCCESS)
Main PID: 1323 (code=exited, status=0/SUCCESS)
Tasks: 52
Memory: 352.2M
CPU: 5.884s
CGroup: /system.slice/mongod.service
└─1538 /usr/bin/mongod --config /etc/mongod.conf
Apr 05 19:01:51 vps100000 systemd[1]: Starting High-performance, schema-free document-oriented database...
Apr 05 19:01:52 vps100000 mongod[1323]: about to fork child process, waiting until server is ready for connections.
Apr 05 19:01:52 vps100000 mongod[1323]: forked process: 1538
Apr 05 19:02:04 vps100000 systemd[1]: Started High-performance, schema-free document-oriented database.
● widestage.service - widestage node.js server
Loaded: loaded (/mnt/widestage/widestage.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2019-04-05 19:01:51 CEST; 1min 32s ago
Main PID: 1347 (node)
Tasks: 10
Memory: 49.5M
CPU: 2.195s
CGroup: /system.slice/widestage.service
└─1347 /home/ubuntu/.nvm/versions/node/v6.10.0/bin/node /mnt/widestage/server.js
Apr 05 19:01:51 vps100000 systemd[1]: Started widestage node.js server.
Apr 05 19:01:57 vps100000 widestage[1347]: mongo DB connection
Apr 05 19:02:01 vps100000 widestage[1347]: Server running at http://0.0.0.0:3111/ in worker 1347
Apr 05 19:02:01 vps100000 widestage[1347]: Mongoose default connection disconnected
Apr 05 19:02:01 vps100000 widestage[1347]: Mongoose default connection error: MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
Widestage service:
[Unit]
Description=widestage node.js server
After=network.target nginx.target mongod.target
[Service]
ExecStart=/usr/bin/taskset -c 0 /home/ubuntu/.nvm/versions/node/v6.10.0/bin/node /mnt/widestage/server.js
# Required on some systems
WorkingDirectory=/mnt/widestage
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Output to syslog
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=widestage
User=ubuntu
#Group=<alternate group>
Environment=NODE_ENV=production
Environment=FOREVER_ROOT=/mnt/widestage
Environment=PORT=3111
[Install]
WantedBy=multi-user.target
@jwilm thanks for a nice unit file, I have one question though, how is the $MAINPID set?
Assumes mongod config file specifies
pidfilepath = /var/run/mongodb/mongod.pid
and is located at/etc/mongod.conf
.
@jwilm, I figured it out, it's an environment variable set by systemctl
systemctl show mongod
will print the MainPID among other things 👍
@Genda1ph yours is perfect for Debian 9.
systemctl enable mongod and voila 👍
if relevant, here for CentOS 7.8 :
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target
[Service]
Type=forking
PIDFile=/var/run/mongodb/mongod.pid
ExecStartPre=/bin/mkdir -p /var/lib/mongo
ExecStartPre=/bin/chown mongod:mongod /var/lib/mongo
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongod
Group=mongod
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
mongodb.service
Loaded: masked (Reason: Unit mongodb.service is masked.)
Active: failed (Result: signal) since Wed 2021-04-28 10:04:49 CAT; 44min a>
Main PID: 6242 (code=killed, signal=ABRT)
Need to make sure you don't have forking turned on in mongos or mongodb config file !