为什么服务service_name status对不同的服务给出不同的响应?

为什么服务service_name status对不同的服务给出不同的响应?

运行“service service_name status”命令时,如果使用三个不同的 service_name,则会出现三种不同类型的输出。我尝试了 atftpd、apache2 和 isc-dhcp-server,如下所示。

user@host:~$ service atftpd status
Usage: /etc/init.d/atftpd {start|stop|restart|reload|force-reload}
user@host:~$ service apache2 status
Apache2 is running (pid 1103).
user@host:~$ service isc-dhcp-server status
isc-dhcp-server start/running, process 5696

这可能是因为 atftpd 尚未转换为 Upstart 吗?

isc-dhcp-server 的状态显示“启动/运行”,这表明它已转换为使用 Upstart。我原以为 apache2 已经转换为 Upstart。如果已经转换,那为什么它不显示“启动/运行”?

答案1

我觉得在 Ubuntu 上进行一些挖掘和谷歌搜索后,我可能会了解更多。并非所有服务都已移植到 Upstart。

ls -l /etc/init.d/

上述命令列出了所有文件,但我们只对其中几个感兴趣。

-rwxr-xr-x 1 root root 7621 Feb  6  2012 apache2
-rwxr-xr-x 1 root root 1511 Oct 17  2011 atftpd
lrwxrwxrwx 1 root root   21 Sep 14 10:57 isc-dhcp-server -> /lib/init/upstart-job

如您所见,apache2 和 atftpd 尚未转换为 Upstart,而 isc-dhcp-server 已转换为 Upstart。让我们列出另一个目录中的文件。

ls -l /etc/init

再次列出了许多文件,但我们只对其中一个感兴趣:

-rw-r--r-- 1 root root 1704 Sep 14 10:56 isc-dhcp-server.conf

这证实 isc-dhcp-server 已转换为 Upstart,但 apache2 和 atftpd 尚未转换。

但现在的问题是,是否使用旧的调用-rc.d或者/etc/init.d/命令来启动/停止/等等服务,或者使用服务命令,或者使用初始化(Upstart)命令?我最理解的答案是始终使用服务命令。根据 /etc/init.d/ 中 init 文件的配置方式,服务将使用初始化(或者开始或者停止)转换为 Upstart 的服务并使用较旧的/etc/init.d/对于尚未转换的服务。作为用户,我们不必担心,并且始终使用服务. 免责声明:我只在 Ubuntu 12.04 中测试过。

答案2

正确,这是因为您正在检查两种服务的状态,一种是 Upstart ntive(isc-dhcp-server),另外两种是系统 V样式的 init 脚本。其中一个 SysV 脚本 (atftpd) 不支持 status 命令。与和status不同,子命令不是强制的 init 脚本命令。startstop

Apache 未转换为 Upstart 的原因在于它如何分叉进程。简而言之,Upstart 使用内核 ptrace() 功能来跟踪分叉,但它只跟踪分叉而不退出,它假定父进程已经消失。长话短说,这与某些守护进程处理分叉的方式不兼容,例如 apache2 和 postfix。

这两个 老虫子,直击问题的技术核心。

有些人编写自己的 Upstart 作业并使用“不分离”选项启动 Apache 取得了一些成功,但这是不受支持的,如果您不小心,软件包升级可能会破坏您的更改。用户不应编辑初始化脚本和 Upstart 作业。Dpkg 认为这是一个冲突,并在升级时提示您。如果您没有特定的理由将 Apache 切换到本机 Upstart 作业,我会坚持使用初始化脚本。注意:适当地修改 Upstart 作业的方法是创建一个 .override 文件[参见人5初始化]。

将来,Upstart 可能会从 ptrace() 切换到使用 cgroups 来管理进程组,这将消除此类问题。但我相信这仍然遥不可及。

相关内容