systemctl init.d和service之间的区别


39

我是Linux新手,并且一直在使用Amazon Lightsail实例(Ubuntu 16.04 LTS)测试自己。

通过我遇到的许多指南,我看到人们使用不同的命令来启动/停止/重新启动/重新加载/状态检查服务。特别是这些;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

以上所有命令均有效。

  1. 我是否应该优先选择一个命令?
  2. 如果是,那为什么呢?
  3. 我还有其他需要注意的命令吗?

当我想使用状态选项时,在Monit中使用init.d会引起问题(状态是该服务实际上处于联机状态,但该服务已脱机-由Monit重新启动)。将Monit中的代码从inid.d更改为/ bin / systemctl对其进行修复。

看来使用init.d可以提供有关其他情况的更多信息。如果我应该使用其他命令之一,是否可以让它们显示有关执行的更多信息?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

我谨在此先感谢大家花时间阅读并回答了这个问题。


在Linux中,执行动作通常不止一种方法。没有哪个是好是坏,是非对错。我个人使用打字最少的那个。当Ubuntu更改为systemd时,其中许多命令可能是符号链接或向后兼容。

systemctl是首选语法,并service作为向后兼容提供。/etc/init.d/pure-ftpd或类似名称直接调用开始/停止脚本。
豹”

Answers:


57

首先,从SysVInit到开始之间有一段完整的历史和斗争SystemD。与其尝试将所有内容分解为一个答案,不如将其引荐给Google进行一些冒险活动,以获取有关历史记录的更多详细信息以及有关该主题的一篇特定文章:

http://www.tecmint.com/systemd-replaces-init-in-linux/

总而言之,这是一个缓慢而艰巨的过渡。一些旧功能保持不变(例如在init.d某种程度上)。如果您可以选择将其systemctl用于服务控制,则建议您使用该控件。这是Linux的可预见的未来,最终SysVInit将认为较旧的方法将被完全弃用并删除。

要涵盖您具体列出的每个人:

  1. sudo systemctl status apache2.service

这是SystemD处理服务的新方法。展望未来,Linux上的应用程序被设计为使用systemd方法,而不是其他方法。

  1. sudo /bin/systemctl status apache2.service

这与上一个命令相同。这种情况下的唯一区别是,它不依赖于shell的$PATH环境变量来查找命令,而是通过包括命令路径来显式列出命令。

  1. sudo /etc/init.d/apache2 status

这是SysVInit调用服务的原始方法。将为服务编写初始化脚本,并将其放置在此目录中。尽管许多人仍使用此方法,service但该命令取代了调用此服务的方法SysVInit。在上具有的较新系统上具有一些旧功能SystemD,但是大多数较新的程序都不包含此功能,并且并非所有较旧的应用程序初始化脚本都可以使用它。

  1. sudo service apache2 status

这是SysVInit用于服务系统的主要工具。在某些情况下,它只是链接到/etc/init.d/脚本,但在其他情况下,它转到了存储在其他位置的初始化脚本。目的是为了更平滑地过渡到服务依赖项处理。


最后,您提到想知道如何从命令中获取更多信息,因为某些命令比其他命令提供更多的信息。这几乎总是由应用程序以及他们如何设计其init或服务文件确定的。但是,作为一般规则,如果它默默完成,那就成功了。然而,为了验证startstop或者restart,你可以使用status子命令,看看它是如何做的。您提到status在旧的初始化脚本上命令不正确。这是应用程序开发人员必须查看的错误。但是,由于初始化脚本已成为处理服务的不推荐使用的方法,因此它们可能会忽略该错误,直到它们完全删除了初始化脚本选项为止。的systemctl status 应始终正常工作,否则应向应用程序开发人员记录错误。


非常感谢您的详细答复。我也在谷歌搜索答案,但是这个确实让我感到困惑,因此我将其发布在这里。我还看到sudo systemctl status apache2起作用了,而不是(sudo systemctl status apache2.service)。继承.service部分是否有害?
Waqas Tariq

@WaqasTariq没问题!这两个都应该起作用,systemctl将搜索存储服务文件的目录,并在找到后为您添加“ .service”。因此,例如,如果您仅在写完标签后点击过一次标签sudo systemctl status apache2,则应通过.service为您添加来完成标签。如果有多个apache2 systemctl文件(例如.service和,则.target您必须打两次制表符,以便它显示所有可用的选项。)
TopHat

得到它了。感谢您的回答和时间。
Waqas Tariq

@WaqasTariq欢迎您!
TopHat'5
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.