我是 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
以上所有命令均有效。
- 我是否应该优先选择其中一个命令?
- 如果是,那么为什么?
- 还有其他我需要注意的命令吗?
当我想使用状态选项时,在 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 方法将被视为完全弃用并被删除。
为了涵盖您具体列出的每一个:
sudo systemctl status apache2.service
这是 systemd 处理服务的新方法。今后,Linux 上的应用程序将使用 systemd 方法,而不是任何其他方法。
sudo /bin/systemctl status apache2.service
这与上一个命令相同。唯一的区别在于,它不依赖 shell 的
$PATH
环境变量来查找命令,而是通过包含命令的路径来明确列出命令。sudo /etc/init.d/apache2 status
这是调用服务的原始 SysVInit 方法。将为服务编写初始化脚本并将其放入此目录中。虽然许多人仍在使用此方法,但此
service
命令取代了 SysVInit 中调用服务的此方法。在较新的带有 systemd 的系统上,此方法具有一些旧功能,但较新的程序不包含此功能,并且并非所有较旧的应用程序初始化脚本都适用于此方法。sudo service apache2 status
这是 SysVInit 系统上用于服务的主要工具。在某些情况下,它只是链接到脚本
/etc/init.d/
,但在其他情况下,它会转到存储在其他地方的初始化脚本。它旨在提供更平稳的服务依赖性处理过渡。
最后,您提到想知道如何从命令中获取更多信息,因为某些命令提供的信息比其他命令多。这几乎总是由应用程序以及它们如何设计其 init 或服务文件决定的。但一般来说,如果它默默完成,则是成功了。但是,要验证start
、stop
或restart
,您可以使用status
子命令来查看其运行情况。您提到status
旧 init 脚本上的命令不正确。这是应用程序开发人员必须查看的错误。但是,由于 init 脚本正在成为处理服务的弃用方法,他们可能会忽略该错误,直到他们完全删除 init 脚本选项。应该systemctl status
始终正常工作,否则应该向应用程序开发人员记录错误。