是否有在Linux上启动和停止服务的标准方法?


15

直到最近,还存在一种简单有效的启动/停止/重新启动服务的方法:

service nginx start|stop|restart

多年来,它一直运行良好,...直到一些智能裤决定改进它们,现在我面对的是Debian / Ubuntu系统,该service脚本什么也不做(因为我应该使用类似的东西systemctl start nginx.service(更长的时间,无法自动完成工作,...)

我的问题专门针对Debian和Ubuntu,但也涵盖CentOS / RedHat发行版也会有所帮助。

因此,有什么可以使我免受这一注定的变化的困扰吗?

如果不清楚,我正在寻找一种一致的方式来处理这些问题,一种可以在Debian 7.x,8.x,最新的Ubuntu LTS和非LTS上运行的方法。

PS。在此特定问题的范围之外,但是如果解决方案还涵盖了服务的启用和禁用部分,则可以给予额外的荣誉。


5
制表符补全对我来说适用于systemctl ...而且,不管喜欢与否,systemd 现在事实上的标准:也可以习惯它。
jasonwryan

1
另外:如果服务命令变得无用,我可以将其删除吗?什么包装提供了它?
2015年

3
service用调用servicectl的包装程序代替旧命令没有意义吗?
2015年

4
@jasonwryan是的,但是您也可以做到这一点,并且包装程序可以处理它,从而使用户更轻松地过渡到系统化。
德米特里·格里戈里耶夫

2
难道service真的什么都不做的吗?它可以在我的LMDE(基本上是Debian测试)上按预期工作,我不认为这是特定于LMDE的东西。它也可以在我的Ubuntu VM中按预期工作。
terdon

Answers:


6

在Unix平台纠结的历史中,存在着各种各样的引导和服务控制系统。

service\chkconfig您发现简单有效的基于基础的系统通常被称为SysVinit样式,这是实现某种标准化的重要一步。您会在RHEL / CentOS(EL)的第6版,从Fedora到14的发行版以及直到2015年的基于Debian / Ubuntu的发行版中都找到这种启动方式。它并不是唯一的启动系统,(简单的)BSD风格。初始化系统仍然有很多粉丝。

SysVinit并不是一个完美的解决方案(是什么?),Systemd旨在克服许多问题。这是systemctl您现在正在体验的基于命令的系统。尽管它并没有得到普遍的欢迎(人们讨厌变化,膨胀等),但毫无疑问,它正在迅速成为大多数发行版中的事实上的标准。

因此,立即展望您最初问题的答案很简单:
现在可以控制大多数 Linux发行版中的服务的标准方法!systemctl
任何人都可以猜到,这将持续多久?可能直到出现更好的情况并被广泛采用为止。

我敢肯定,您当前最喜欢的包装器将允许您service/chkconfig继续执行大多数理智的事情的命令,但是对于这种特殊的学习曲线,最好不要使用它。也许期待,一段时间内还将有systemctl一些旧系统的包装器,以使它们与更多最新系统一起管理变得轻而易举;)


在此之前是xinetd,在之前是inetd
jas-2015年

@ jas-我认为inetd本身就是服务,我相信它们可以存在于所有引导系统中。它们是一种特殊的服务,因为它们代替了按需提供,从而为某些其他服务提供了替代功能,使其可以作为完整服务运行。我了解您在此问题中来自哪里,这只是启动服务的另一种方式。
DanSut 2015年

在所有发行版中;gentoo,centos,redhat,debian,ubuntu等,xinetd和先前的inetd包含用于启动,停止和重新加载各种服务的配置的小型Shell脚本,但是是的,您的确它们确实像systemd一样是一项服务。
jas-2015年

Ubuntu从6.10开始使用upstart,从9开始一直使用Fedora(直到被systemd取代)upstart.ubuntu.com,并且有可能已经将Debian从sysvinit切换了很多年……
James Tocknell

5

[ service用一个调用servicectl[sic] 的包装器代替旧命令不是[有意义]吗?

是的,但是[…]包装程序可以处理它,从而使用户更轻松地过渡到系统化。

……正如其他人在评论中说的那样,此后已经做了很长时间了

/usr/sbin/serviceDebian 8上的命令是sysvinit-utils软件包的一部分。它自2009年以来一直存在。它是原始sysvinit源软件包中Debian特定于RedHat的附加内容,从阅读脚本可以看出,它既识别系统运行,又识别新贵作业的存在,将命令编排到systemctlinitctl(通过其别名)。自2013年以来就做到了。

service name action即使在非Linux操作系统上也可以使用。它甚至可以在大多数BSD上运行,因为它们也有自己的service命令。servicenosh包中还有一个shim 命令,可转换为。但是...system-control action name

  • ……超越了这个共同的子集,周围的兼容性大大降低。
  • …OpenBSD没有service命令。
  • …BSD service命令具有长期存在的众所周知的问题,即系统管理员数十年来一直在讲战争故事。

启用和禁用服务是类似的情况。虽然SuSE的chkconfig(包装为Debian和Ubuntu提供)计划是对Fedora的一个非常不同的(它们被写在完全不同的编程语言,甚至-一个编辑,一个解释),有一个共同的最小的语法,用行动为或chkconfig name actiononoff。但是...

  • ……再次,除了这个通用子集之外,兼容性更差。
  • chkconfigBSD 上没有,因为用于此目的的常规工具是sysrc或更新的OpenBSD rcctl enablercctl disable。nosh程序包中有chkconfigrcctl会转换为system-control enable name和。system-control disable name
  • ...只有Fedora的chkconfig知道systemd并作为一个垫片systemctl enablesystemctl disable。SuSEchkconfig不了解systemd。

进一步阅读


2

在Linux上没有启动和停止服务的标准方法。

有什么可以让我摆脱这一注定的变化的吗?

试试配置管理/编排工具:AnsibleChefSaltstackPuppet或其他。

您可以使用Ansible启动并启用服务:

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

看一下Ansible 模块中的LinuxService类service

这是Linux Service操纵类​​-当前支持混合使用二进制文件和初始化脚本,以控制引导时启动的服务以及控制当前状态。


看起来,Ubuntu家伙在切换到systemd之后似乎能够保持服务脚本正常工作。从内部看,它似乎足够聪明,可以使用正确的后端。关于Debian无法说同样的话。
2015年



1

您的问题是Debian / Ubuntu已切换到新版本systemd以替代旧版本sysvinit。询问哪个更好,您将开始一场火焰大战,但是您可以始终切换回旧版本sysvinit,如果要返回,请选中此选项

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.