对“ /etc/init.d”和“ / lib / systemd / system”中的服务感到困惑


15

我是Linux世界的新手,对于我可能会说的任何错误表示抱歉。

我试图在Debian 8.5机器上运行Mongo DB。安装软件包(从percona.com预先构建)后,我注意到以下文件:

/etc/init.d/mongod (1)
/lib/systemd/system/mongod.service (2)

关于/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

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

  • 我不知道是否在启动时调用它。

  • 我不明白为什么需要两个“服务”文件,以及如何摆脱其中一个文件(可能更简单,所以可能在/ lib / systemd中一个文件)。

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

  • 我也阅读了systemctl适用于init.d脚本的内容,在这种情况下,我不了解这两个文件中的哪个将由触发systemctl mongod start

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

  • 开机时叫
  • 可通过命令(如servicesystemctl)调用。

你能帮我弄清楚我的想法吗?在一些评论的帮助下,我可能可以集中精力并缩小问题范围。

Answers:


12

当您同时拥有一个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。您还可以包括该选项--now,它将同时启动mongod。


谢谢!我将学习systemd并最终使用它。现在,我想禁用它,最后运行我一直在努力的init.d脚本。我去:systemctl disable mongod; 然后将mongod.service重命名为mongod-backup.service; 然后systemctl daemon-reload。您认为这是正确的吗?我读过您不应该修改/ lib / systemd / system /中的文件,但是如果不重命名,systemctl会一直忽略init.d脚本。
natario

/ lib / systemd中的文件不是conffile。我真的不建议安装debian软件包并修改其文件(然后再更新软件包)。相反,您应该重命名一直在“工作”的init.d脚本(可能正在修改?)。init.d脚本往往是conffiles。如果更新更改了配置文件(不应有任何原因),它将首先警告您。在这种情况下,我希望它可以通知您(如果有效)已删除的原始(有效)init.d脚本的更新版本。
sourcejedi

您可能需要将新服务上的订购依赖性添加到所依赖的服务上mongod。还有机会您必须删除一些严格的依赖关系,但是我没有想到。修改受影响的服务的一种安全方法是将它们复制到/etc/systemd/system/并修改副本。
sourcejedi's

总的来说,我认为坚持使用systemd比较简单。您现在正在研究bash,init函数 systemd的向后兼容功能。由于您不是在学习纯粹的SysV初始化系统,因此,如果您曾经使用过这样的系统,则可能会有期望实际上来自systemd的功能的风险。
sourcejedi's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.