对 /etc/init.d 与 /lib/systemd/system 服务感到困惑

nat*_*rio 18 linux init-script systemd sysvinit

我正在尝试在 Debian 8.5 机器上运行 MongoDB。当我安装这个包(从 percona.com 预先构建)时,我注意到以下文件:

/etc/init.d/mongod (1)
/lib/systemd/system/mongod.service (2)
Run Code Online (Sandbox Code Playgroud)

我知道它/etc/init.d/mongod在启动时或在其他特定系统状态下被调用,只要它是通过update-rc.d. 这对我来说完全没问题。该脚本初始化并启动 mongo 守护进程。它似乎有启动、停止、重启等的“触发器”,据我所知,我可以用sudo service mongod <action>.

/lib/systemd/system/mongod.service 似乎做同样的事情(即运行 mongo),但配置较少 - ExecStart 参数中只有一行:

[Unit]
Description=MongoDB (High-performance, schema-free document-oriented database)
After=time-sync.target network.target
[Service]
Type=forking
User=mongod
Group=mongod
PermissionsStartOnly=true
EnvironmentFile=/etc/default/mongod
ExecStart=/usr/bin/env bash -c "/usr/bin/mongod $OPTIONS > ${STDOUT} 2> ${STDERR}"
PIDFile=/var/run/mongod.pid
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

据我了解,这可以通过sudo systemctl start mongod.

  • 我不明白是否在启动时调用。

  • 我不明白为什么需要这些“服务”文件中的两个,以及如何摆脱一个(可能是 /lib/systemd 中的一个,因为它简单得多)。

  • 我不明白这两者之间是否有任何关系。

  • 我也读过它也systemctl适用于init.d脚本,在这种情况下,我不明白这两个文件中的哪一个将由systemctl mongod start.

认为有一些冗余,我应该只选择两种方式之一。我想确定它是

  • 在启动时调用
  • 可通过命令调用(如servicesystemctl)。

你能帮我理清思路吗?

sou*_*edi 13

当您同时拥有一个init.d脚本和一个.service同名的 systemd文件时,systemd 将使用该服务文件进行所有操作。我相信该service命令只会重定向到 systemd。init.d 脚本将被忽略。

使用systemd. 它是 Debian 8 中的新功能,但它是默认设置。Systemd 服务文件应该看起来比 init.d 脚本简单。您没有提到 systemd 服务不支持的任何您需要的特定功能。

如果不包含服务文件,则systemd很乐意使用 init.d 脚本。所以 mongod 包开发人员告诉你他们认为这个 systemd 定义更好:)。

看看输出systemctl status mongod。如果在启动时启用该服务,该Loaded:行将显示“已启用”。否则,您可以使用systemctl enable mongod. 您还可以包含 option --now,它会同时启动 mongod 。