Debian中的服务如何工作,如何管理它们?


79

在Windows中,我有服务管理器,在其中可以看到所有可以通过Windows本身启动的系统服务,可以设置它使用的用户,权限管理位于其中,还可以将变量和其他一些信息传递给服务,我可以命名它们,也可以创建一个程序的重复服务,依此类推。所以我在Windows中有一个主要的管理工具。

我如何在Linux中做同样的事情?如何在启动时触发运行“ svnserve”,或者如何配置要在特殊上下文中运行的服务。我如何查看所有“编程”服务?


9
您使用什么发行版和版本?服务管理(在Unix世界中,服务几乎总是被称为“守护程序”)过去很容易而且是半标准的。如今情况变得更加多样化。而且并不总是很好。:)另外,上下文是什么意思?
Alexios

尽管似乎systemd正在慢慢赢得init系统大战。Debian是仍然使用旧的SysVinit的最后一个大支持,目前正在确定要使用哪个初始化系统。
Patrick

1
目前,我正在使用Debian(最新稳定版),在上下文中,我指的是路径变量或指定的用户上下文。
Erdinc Ay 2013年

1
如果您只需要server在Debian 上使用命令,请参阅unix.stackexchange.com/q/226089/130402
Peter Krauss

Answers:


124

linux当前使用3个主要的init系统。几年前,只有一个,SysVinit。但是SysVinit严重缺乏诸如服务依赖关系图之类的功能,因此到目前为止,在大多数发行版中都已弃用它。当前大多数发行版都在切换到systemd。虽然也有暴发户

但是,这是针对三个init系统中的每个系统的问题的答案:

 

SysVinit

Debian和RedHat当前使用的SysVinit。尽管下一版的RedHat(7)将使用systemd。

在启动时启用SysVinit服务的唯一方法是将它们符号链接到/etc/rc3.d(或/etc/rc2.d)中。所有服务都可以在中找到/etc/init.d。但是请注意,发行版通常会拥有自己的工具来管理这些文件,而应改用该工具。(Fedora / RedHat有servicechkconfig,ubuntu有update-rc.d

列出服务:

ls /etc/init.d/

启动服务:

/etc/init.d/{SERVICENAME} start

要么

service {SERVICENAME} start

停止服务:

/etc/init.d/{SERVICENAME} stop

要么

service {SERVICENAME} stop

启用服务:

cd /etc/rc3.d
ln -s ../init.d/{SERVICENAME} S95{SERVICENAME}

S95用于指定顺序。S01将在S02之前开始,依此类推)

禁用服务:

rm /etc/rc3.d/*{SERVICENAME}

 

系统化

使用systemd最值得注意的发行版是Fedora。虽然它被许多其他人使用。另外,随着Debian选择在新贵的情况下使用systemd,它将成为大多数发行版的事实上的新贵系统(ubuntu已经宣布他们将放弃systemd的新贵)。

列出服务:

systemctl list-unit-files

启动服务:

systemctl start {SERVICENAME}

停止服务:

systemctl stop {SERVICENAME}

启用服务:

systemctl enable {SERVICENAME}

禁用服务:

systemctl disable {SERVICENAME}

 

暴发户

Upstart由Ubuntu员工开发。但是在debian 决定使用systemd之后,Ubuntu 宣布将放弃新贵

RedHat也曾短暂地使用过Upstart,因为RHEL-6中存在它,但并不常用。

列出服务:

initctl list

启动服务:

initctl start {SERVICENAME}

停止服务:

initctl stop {SERVICENAME}

启用服务:

不幸的是,有2种方法:

  1. 将有一个/etc/default/{SERVICENAME}包含一行的文件ENABLED=...。将此行更改为ENABLED=1

  2. 将有一个文件/etc/init/{SERVICENAME}.override。确保它包含start(或完全不包含),而不是manual

禁用服务:

echo manual > /etc/init/{SERVICENAME}.override

注意:Gentoo还使用了“ OpenRC”初始化系统。目前,Gentoo是唯一使用它的发行版,尚未考虑使用它,也未得到任何其他发行版的支持。因此,我不讨论它的用法(尽管如果可以,我可以添加它)。


OpenRC是SysVinit的一种抽象。它不会替代它,而是增加它。
Spidey 2013年

很棒的文章!仅作一些小小的修改:RHEL 6.x(因此,CentOS 6.x和其他衍生产品)使用了新贵,就像Ubuntu一样(尽管大多数服务仍然使用SysV脚本)。另外,我还要补充一点:“ chkconfig”(RH)和“ update-rc.d”(Debian)是向rc?.d目录添加链接的“官方”方法。
rsuarez 2013年

@rsuarez关于RHEL6的要点。虽然似乎没有多少用。大多数系统仍通过旧版SysVinit运行(我的RHEL6系统之一上有17个新贵,89个SysVinit)。而chkconfigupdate-rc.d被提及。参见SysVinit下的第二段:-)
Patrick

@Patrick同意#1;“哎呀!” 在#2上:-)
rsuarez 2013年

1
感谢您提供全面的答案,现在我已经了解了。目前,我正在使用Debian(最新的稳定器),在说德语的欧洲,它提供了最好的建议,但是也许我会尝试Redhat。
Erdinc Ay 2013年

9

不同的发行版使用不同的机制来管理服务。用于管理服务的软件称为init,它是第一个进程(进程ID为1)的传统名称,该进程负责启动其他进程。

Debian使用init 的传统SysVinit变体。在此系统下,目录中有一组脚本/etc/init(此位置和其他位置在使用SysVinit的发行版之间可能会略有不同)。这些脚本不是直接调用,而是通过directory中的符号链接调用/etc/rc?.d。这些符号链接的存在和名称决定了何时启动服务。有关更多详细信息,请阅读Debian Reference中有关init章节

看看有/etc/rc?.d什么服务已经存在。点之前的字母或数字是运行级别;以名称开头的条目在进入运行级别时S用参数执行start,而以名称开头的条目K在离开运行级别时执行。正常的运行级别顺序是:引导期间为S(/etc/rcS.d/S*已执行),然后为2(/etc/rc2.d/S*已执行)。在关闭时,/etc/rc2.d/K*将执行该命令,然后将运行级别切换为0(或重新启动为6)。

简而言之,如果要为新服务创建启动脚本:

  • 在中编写一个shell脚本/etc/init.d。该脚本必须接受一个参数,它可能是startstopforce-reloadrestart,或(可选)reloadstatus。之间的差reloadrestartrestart对相当于stop接着start同时reload重新加载配置不停止任何东西(如果服务支持的话); force-reload确实reload,如果可用,restart否则。有关示例,请参见现有文件和使Debian在启动时运行的制作脚本
  • 运行update-rc.d以创建符号链接以启动和停止您的服务。大多数服务在运行级别2、3、4和5中运行。

请注意,要提供svn访问,可能更容易设置Apache并使用HTTP或HTTPS协议。这具有允许通过Web浏览器快速浏览存储库的附带好处。


2

在传统的UNIX背景下,服务没有什么特别的。服务只是过程,但有两个例外:它们不需要终端,并且可以在启动时启动。它们在启动时的方式取决于init(可以是sysv init,bsd init,upstart,systemd或其他内容;请检查手册页中的init)以及您是否正在使用包装器来执行任务或用于init配置。没有什么可以阻止您从终端运行服务,实际上,这对于测试目的是很常见的。

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.