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中的代码从init.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。 - Panther
systemctl 是首选的语法,而 service 则提供向后兼容性。/etc/init.d/pure-ftpd 或类似的方式直接调用启动/停止脚本。 - Panther
1个回答

首先,从SysVInit到SystemD之间存在着整个历史和斗争。然而,我不打算在一个回答中详细解释所有这些内容,我建议你通过谷歌搜索了解更多关于这个历史的细节,以及一篇特定的文章:
《{{link1:'init'和'systemd'背后的故事:为什么需要用'systemd'取代Linux中的'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 方法。对于一个服务,init 脚本会被编写并放置到此目录中。尽管许多人仍在使用该方法,但在 SysVInit 中,service 命令替代了此方法来调用服务。在较新的系统上,还存在一些遗留功能,但较新的程序不再包括它,并且并非所有旧的应用程序 init 脚本都能与之兼容。

  4. sudo service apache2 status

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

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

非常感谢您详细的回复。我也在谷歌上搜索答案,但这个问题真的让我困惑,所以我在这里发帖了。我还注意到sudo systemctl status apache2可以工作,而不是(sudo systemctl status apache2.service)。放弃.service部分会有什么危害吗? - Waqas Tariq
3@WaqasTariq 没问题!这两种方法都可以,systemctl会搜索服务文件存储的目录,并在找到时为你添加".service"。所以例如,如果你只输入了 sudo systemctl status apache2,按一次tab键它会自动补全为 sudo systemctl status apache2.service。如果有多个apache2的systemctl文件(例如 .service.target),你需要按两次tab键才能显示所有可用选项。 - TopHat