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

Erd*_* Ay 86 startup subversion debian services sysvinit

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

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

phe*_*mer 129

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

但这是您对 3 个 init 系统中的每一个的问题的答案:

 

系统初始化

SysVinit 目前被 Debian 和 RedHat 使用。尽管 RedHat (7) 的下一个版本将使用 systemd。

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

列出服务:

ls /etc/init.d/
Run Code Online (Sandbox Code Playgroud)

启动服务:

/etc/init.d/{SERVICENAME} start
Run Code Online (Sandbox Code Playgroud)

或者

service {SERVICENAME} start
Run Code Online (Sandbox Code Playgroud)

停止服务:

/etc/init.d/{SERVICENAME} stop
Run Code Online (Sandbox Code Playgroud)

或者

service {SERVICENAME} stop
Run Code Online (Sandbox Code Playgroud)

启用服务:

cd /etc/rc3.d
ln -s ../init.d/{SERVICENAME} S95{SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

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

禁用服务:

rm /etc/rc3.d/*{SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

 

系统化

最著名的使用 systemd 的发行版是 Fedora。虽然它被许多其他人使用。此外,由于 Debian 选择使用 systemd 而不是 upstart,它将成为大多数发行版事实上的 upstart 系统(ubuntu 已经宣布他们将放弃 systemd 的 upstart)。

列出服务:

systemctl list-unit-files
Run Code Online (Sandbox Code Playgroud)

启动服务:

systemctl start {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

停止服务:

systemctl stop {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

启用服务:

systemctl enable {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

禁用服务:

systemctl disable {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

 

暴发户

Upstart 是由 Ubuntu 开发的。但是在 debian决定使用 systemd 之后,Ubuntu宣布他们将放弃 upstart

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

列出服务:

initctl list
Run Code Online (Sandbox Code Playgroud)

启动服务:

initctl start {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

停止服务:

initctl stop {SERVICENAME}
Run Code Online (Sandbox Code Playgroud)

启用服务:

不幸的是2种方式:

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

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

禁用服务:

echo manual > /etc/init/{SERVICENAME}.override
Run Code Online (Sandbox Code Playgroud)

注意:还有 Gentoo 使用的“OpenRC”初始化系统。目前 Gentoo 是唯一使用它的发行版,并且没有考虑使用它,也没有任何其他发行版支持它。所以我没有涵盖它的用法(尽管如果我有意见,我可以添加它)。


Gil*_*il' 9

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

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

看一看在/etc/rc?.d看到服务已经存在的东西。点前的字母或数字是运行级别;名称以 开头的条目在进入运行级别时S与参数start一起K执行,名称以 开头的条目在离开运行级别时执行。正常的运行级别顺序是:启动时为 S(so/etc/rcS.d/S*被执行),然后是 2(so/etc/rc2.d/S*被执行)。在关闭时,/etc/rc2.d/K*执行,然后运行级别切换到 0(或 6 用于重新启动)。

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

  • /etc/init.d. 此脚本必须接受一个参数,该参数可能是start, stop, force-reload, restart, or (optional) reloador status。之间的差reloadrestart是,restart以等于stop随后start同时reload重新加载配置不停止任何东西(如果服务支持的话); force-reload确实reload,如果可用,restart否则。有关示例,请参阅现有文件和使脚本在启动时与 Debian 一起运行
  • 运行update-rc.d以创建符号链接以启动和停止您的服务。大多数服务在运行级别 2、3、4 和 5 中运行。

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