"Service"和"/etc/init.d/"之间有什么区别?

我已经管理Ubuntu和其他操作系统的服务器安装有一段时间了 - 我已经习惯了使用/etc/init.d/来重新启动服务。现在我收到了这个消息:

root@tatooine:~# /etc/init.d/mysql status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status mysql
mysql start/running, process 14048

这似乎是在最新的Ubuntu LTS版本中引入的 - 为什么?/etc/init.d/有什么问题,service和/etc/init.d/之间有什么区别?

3新秀食谱中包含了一个很好的切换理由的解释。 - ændrük
2个回答

/etc/init.d脚本是一种旧的做事方式。它们来自System V标准。然而,这些脚本只能按照特定的顺序启动,因此无法建立真正的依赖关系。

因此,upstart已经被开发出来,旨在用upstart脚本(位于/etc/init)替代所有的/etc/init.d脚本。

service允许平稳过渡从/etc/init.d脚本到upstart脚本。将来,当越来越多的脚本转移到upstart时,service仍然可以工作,因为它可以找到两种可能性。


6现在要淘汰Upstart了,对吧? - wrongusername
7systemd一旦计划就位,将取代upstart。14.04 LTS将使用upstart。这是由Mark Shuttleworth在一篇名为Losing graciously的文章中宣布的。 - notapatch

还要检查服务命令的man页面:man service

service 在可预测的环境中运行脚本(工作目录为 /,只设置了 2 个环境变量:LANG 和 TERM)。它还增加了执行 --full-restart 的能力。所以总结一下:

  1. service 可以运行位于 /etc/init 或 /etc/init.d(upstart 或 System V)的脚本。
  2. service 在可预测的环境中运行脚本。

"可预测的环境" 方面可能会导致问题,如果您的脚本由于某种原因依赖于环境变量。可能有方法可以解决这个问题,但我不知道是什么方法,这超出了本问题的范围 :)


2嗨 @Joe Marty, 这正是我现在正在遇到的问题。我有一个依赖于“DISPLAY”环境变量的服务,在使用“service myservice start”启动守护程序时该变量不存在,但在使用“/etc/init.d/myservice start”启动时存在。有什么办法可以使这个变量可用吗? - frandevel