systemctl init.d 和 service 之间的区别

systemctl init.d 和 service 之间的区别

我是 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:~$

我想提前感谢花时间阅读和回答这个问题的每个人。

答案1

首先,从 SysVInit 到 systemd 有一段历史和斗争。不过,我不会试图在一个答案中把这一切都分解开来,而是建议你去谷歌搜索,以了解更多有关历史的详细信息,以及一篇关于这个主题的特定文章:

‘init’ 和 ‘systemd’ 背后的故事:为什么 Linux 中需要用 ‘systemd’ 替换 ‘init’

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

为了涵盖您具体列出的每一个:

  1. sudo systemctl status apache2.service

    这是 systemd 处理服务的新方法。今后,Linux 上的应用程序将使用 systemd 方法,而不是任何其他方法。

  2. sudo /bin/systemctl status apache2.service

    这与上一个命令相同。唯一的区别在于,它不依赖 shell 的$PATH环境变量来查找命令,而是通过包含命令的路径来明确列出命令。

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

    这是调用服务的原始 SysVInit 方法。将为服务编写初始化脚本并将其放入此目录中。虽然许多人仍在使用此方法,但此service命令取代了 SysVInit 中调用服务的此方法。在较新的带有 systemd 的系统上,此方法具有一些旧功能,但较新的程序不包含此功能,并且并非所有较旧的应用程序初始化脚本都适用于此方法。

  4. sudo service apache2 status

    这是 SysVInit 系统上用于服务的主要工具。在某些情况下,它只是链接到脚本/etc/init.d/,但在其他情况下,它会转到存储在其他地方的初始化脚本。它旨在提供更平稳的服务依赖性处理过渡。

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

相关内容