如何启用或禁用服务?

我了解了如何在Ubuntu中启用和禁用服务,似乎有不同的方法来管理它们。
我找到的第一种方法是使用"update-rc.d"命令将新的服务添加到启动项中,该命令针对"/etc/init.d"文件夹及其内容。
另一种方法是编辑"/etc/init"文件夹中的".conf"文件。
那么,推荐的启用/禁用/添加服务的方式是什么?为什么?
您能否给出一个简短而可靠的逐步示例,说明如何在Ubuntu中添加、启用和禁用服务?

1有关网络,请参阅:http://askubuntu.com/questions/230698/how-to-restart-the-networking-service - Jorge Castro
这对那些卡在 Fedora 12 上并且来到这里的人会很有帮助。如果链接失效,可以尝试使用 chkconfig - Bleeding Fingers
3请注意,这里仍然缺少Ubuntu 14.04的答案。 - Reinier Post
3@MarcelloNuccio:从Ubuntu 15.04开始,Upstart已被Systemd取代。 - Dan Dascalescu
自启动程序在多个位置的autostart清单或*.service文件中进行配置,还可以在init.dcrontab中进行配置。请参阅:https://unix.stackexchange.com/a/525845/43233 - Noam Manos
9个回答

有一些服务可以通过图形用户界面(如启动应用程序)或终端进行启用/禁用。

对于终端,您有几个选项。首先,打开一个终端(例如,在搜索栏中键入“终端”并打开它)。然后:

临时启用/禁用服务

临时停止和启动服务(不会在未来的启动中启用/禁用它们),您可以输入service SERVICE_NAME [action]。例如:

  • sudo service apache2 stop: 会停止Apache服务,直到重新启动或再次启动为止。
  • sudo service apache2 start: 会启动Apache服务,假设之前已经停止。
  • service apache2 status: 会告诉您服务的状态,无论是启用/运行还是禁用/未运行。
  • sudo service apache2 restart: 会重启服务。这通常在您更改配置文件时使用,例如更改PHP配置或Apache配置。重启将避免您需要使用两个命令行来停止/启动。
  • service apache2: 在这种情况下,由于您没有提及要执行的操作,它将显示该特定服务的所有可用选项。这方面因服务而异,例如,对于MySQL,它只会提到缺少一个参数。对于其他服务,如网络服务,它将提到所有可用选项的简短列表。

Systemd

从Ubuntu 15.04开始,Upstart将被Systemd取代。通过Systemd来管理服务,我们可以使用以下方式(通过systemctl action SERVICE模式):
  • sudo systemctl start SERVICE: 用它来启动一个服务。重启后不会保持启动状态。
  • sudo systemctl stop SERVICE: 用它来停止一个服务。重启后不会保持停止状态。
  • sudo systemctl restart SERVICE: 用它来重新启动一个服务。
  • sudo systemctl reload SERVICE: 如果该服务支持,它将重新加载与其相关的配置文件,而不会中断正在使用该服务的任何进程。
  • systemctl status SERVICE: 显示一个服务的状态。告诉你一个服务当前是否正在运行。
  • sudo systemctl enable SERVICE: 在下次重启或下次启动事件时打开该服务。重启后仍然保持启用状态。
  • sudo systemctl disable SERVICE: 在下次重启或下次停止事件时关闭该服务。重启后仍然保持禁用状态。
  • systemctl is-enabled SERVICE: 检查一个服务当前是否配置为在下次重启时启动。
  • systemctl is-active SERVICE: 检查一个服务当前是否处于活动状态。
  • systemctl show SERVICE: 显示关于该服务的所有信息。
  • sudo systemctl mask SERVICE: 通过将其链接到/dev/null来完全禁用一个服务;你无法手动启动该服务或启用该服务。
  • sudo systemctl unmask SERVICE: 移除与/dev/null的链接,并恢复启用和手动启动该服务的能力。

Upstart(自15.04版起不再使用)

如果我们想要按照官方的Upstart方式(请注意,目前并非所有服务都已转换为Upstart)进行操作,我们可以使用以下命令:

status SERVICE - 这将告诉我们一个已转换的服务是否正在运行。请注意,这种方法已被弃用,取而代之的是startstopstatusrestart命令。它还会告诉我们某个服务是否尚未转换为Upstart:

一个已转换的服务通常会输出当前状态(启动中、运行中、停止中...)和进程ID。一个未转换的服务会显示一个关于未知作业的错误信息。

某些快捷方式只能与上述service命令一起使用,而不能与下面的命令一起使用,除非它们已完全转换为Upstart服务:

  • sudo start mysql:启动
  • sudo stop mysql:停止
  • sudo restart mysql:重启
  • sudo status smbd:状态

启用/禁用服务

要永久启动或停止一个服务,您需要执行以下操作:
echo manual | sudo tee /etc/init/SERVICE.override

在下一次启动时,使用manual选项将阻止Upstart自动加载该服务。以.override结尾的任何服务都将优先于原始服务文件。之后,您只能手动启动该服务。如果您不想这样做,只需删除.override即可。 例如:

echo manual | sudo tee /etc/init/mysql.override

将MySQL服务置于“手动”模式。如果您不想这样做,之后您可以简单地执行以下操作
sudo rm /etc/init/mysql.override

重新启动服务以使其再次自动启动。当然,要启用服务,最常见的方法是安装它。如果您安装了Apache、Nginx、MySQL或其他服务,它们会在完成安装后自动启动,并且每次计算机启动时都会启动。如上所述,禁用将使用服务手动


需要在每个命令后面添加.service吗?systemctl mongod status已经可以正常工作了。 - Dan Dascalescu
@DanDascalescu 不,你不需要,但让我在这里澄清一下。 - Luis Alvarado
4需要将.override文件放置在/etc/init.d/目录中吗?也就是说,服务所在的位置? - Pallav Jha
为什么Upstart在15.04版本中被弃用了?在Ubuntu 16.04或更高版本中,运行脚本的正确方法是什么? - Kamalakannan J
@KamalakannanJ 你用过rc级别吗?(例如/etc/rc0.d)还是/etc/rc.local? - Luis Alvarado
Ubuntu在Debian转向systemd后放弃了upstart这里有Mark Shuttleworth的一些关于此事的废话。 - Hydraxan14
禁止在预systemd系统中启动服务时,我发现/etc/init/FOO.override不起作用。有效的方法是chmod -x /etc/init.d/FOO - Mikhail T.
1非常感谢您提供这个详尽的答案。在Ubuntu 18.04上,systemd命令集非常好用。 - Doktor J
但如果一个新兴服务没有启动,而我又没有“覆盖”文件呢? - Philipp Ludwig
这会引发2个问题@PhilippLudwig - 1. 如何调试upstart服务,2. 为什么我完全丢失了覆盖状态(尝试创建后)。 - Luis Alvarado
我想要永久禁用一个服务(cups),但是我的两种方法都没有成功。 - ka3ak
给未来的读者:还有一个工具叫做chkconfig,例如chkconfig service on可以启用服务。 - Hi-Angel
这个回答缺少关于 Snap 服务的部分。运行 sudo snap services 来查看它们的列表。 - Flimm

目前在Ubuntu中,有三种不同的方式可以将软件作为服务启动,分别是SysV、Upstart和systemd。这里所定义的服务是指由系统在后台运行的程序,而不是由用户直接启动和运行的程序。
SysV
在Linux中启动服务的传统方式是将脚本放置在/etc/init.d目录中,然后使用update-rc.d命令(或在基于RedHat的发行版中使用chkconfig命令)来启用或禁用它。
该命令使用一些稍微复杂的逻辑,在/etc/rc#.d目录中创建符号链接,以控制启动服务的顺序。如果运行ls /etc/rc2.d命令,您可以看到服务将被终止的顺序,文件名类似于K##xxxx,并且以文件名S##xxxx开始。在S##xxxx中的##表示服务xxxx的启动顺序。相反,在K##xxxx中的##表示服务xxxx的终止顺序。
一个主要问题是,当系统启动时,SysV需要按顺序执行所有操作,一个接一个地进行,导致系统启动时间非常慢。尽管有人试图并行化处理,但这些尝试都很零散且难以充分利用。这就是为什么创建了Upstart的主要原因。
Upstart使用位于/etc/init目录下的作业定义文件来定义服务应该在哪些事件发生时启动。因此,在系统启动过程中,Upstart会处理各种事件,然后可以并行启动多个服务。这使得它们能够充分利用系统资源,例如,在一个CPU密集型服务运行时启动一个磁盘密集型服务,或者在网络等待分配动态IP地址时启动服务。
您可以通过运行ls /etc/init/*.conf命令查看所有的Upstart作业文件。
让我在这里停下来说一句,如果您不知道一个服务是什么,或者它的功能是什么,请不要禁用它!

并非所有服务都已转换为Upstart。在过去几个月里,我在Canonical的服务器团队工作期间,我曾处理过许多转换后的作业文件,最好的部分是它允许我们摆脱所有的脚本“魔法”,只需在其中插入一些命令来准确定义如何启动服务,而不多余任何其他内容。但目前,只有少数传统网络服务,如和,已经完成转换。

一个服务是否基于Upstart?

要确定一个服务是否基于Upstart,您可以运行status命令:

status servicename

如果这是一份新兴的工作,它会显示如下内容:
$ status statd
statd start/running, process 942

但如果不是的话,你会看到更像这样的东西:
$ status apache2
status: Unknown job: apache2

在这种情况下,apache2没有被转换为upstart。因此,要禁用apache2,只需运行以下命令
sudo update-rc.d apache2 disable
sudo service apache2 stop

禁用Upstart中的服务(作业)

Upstart作业定义没有update-rc.d命令。要禁用该作业,您需要直接编辑作业文件以禁用它。有两种方法可以做到这一点。

如果您仍然希望能够手动启动它,则需要注释掉start on条件。假设您想安装samba,但不希望它自动启动。以下是作业文件(在natty中):

description "SMB/CIFS File Server"
author      "Steve Langasek <steve.langasek@ubuntu.com>"

start on local-filesystems
stop on runlevel [!2345]

respawn

pre-start script
    RUN_MODE="daemons"

    [ -r /etc/default/samba ] && . /etc/default/samba

    [ "$RUN_MODE" = inetd ] && { stop; exit 0; }

    install -o root -g root -m 755 -d /var/run/samba
end script

exec smbd -F

要禁用samba,你只需在"start on local-filesystems"前面加上一个#。请注意,虽然它不会在启动时重新启动,但你仍然需要停止它这一次。
sudo service smbd stop

如果您根本不希望启动 samba,我建议实际上删除该软件包。但是,如果您希望安装它但不可启动,也可以执行以下操作:
mv /etc/init/smbd.conf /etc/init/smbd.conf.disabled

使用start/stop stanza禁用服务(截至11.04版本)

从将在11.04版本中出现的upstart版本开始,有一个新的关键字可以禁用start onstop on stanza: manual。因此,从11.04版本开始,禁用服务的另一种方法是执行以下操作:

echo 'manual' | sudo tee /etc/init/mysql.override

# command from root shell
echo manual >> /etc/init/mysql.override

你可以创建一个override文件来禁用一个服务,而无需编辑作业定义,只需在文件中加入manual关键字即可。

太好了,谢谢。终于弄清楚如何停止几个“神秘服务”,而且足够让我自己开始尝试各种服务了。 - j-g-faustus
21看起来11.04也有覆盖功能。所以最好使用echo manual >> /etc/init/<service>.override,因为这样可以保留原始的.conf文件。不管怎样,如此基本的启用/禁用功能竟然花了3年时间开发,而且没有图形界面,真是遗憾。 - MestreLion
3update-rc.d 是真正重要的 - Timofey
我假设 *.override 文件会附加到 *.conf 文件中以计算结果,但是这一点在任何地方都没有记录。另一种解释是 *.override 会替换 *.conf 文件的内容,但是这样做可能会破坏 *.conf 文件中的 exec 和其他相关内容。 - Mikko Rantalainen
3似乎比原问题发布者标记为最终答案的回答更好地处理了原始话题。谢谢! :) - Henning
1在我的情况下,文件/etc/init/ssh.conf是存在的,但是status sshstatus sshd都显示为"Unknown job"。这个回答似乎没有解决这种可能性? - Brian Z
1status ssh 给我返回 'Unknown job',但是 service ssh status 对我来说是有效的。 - ptim
Snap服务怎么样?运行sudo snap services来查看它们的列表。 - Flimm

sysv-rc-conf

尝试使用sysv-rc-conf

sudo apt-get install sysv-rc-conf

开始管理服务,请执行以下操作
sudo sysv-rc-conf

这将弹出一个类似于这样的交互窗口。

enter image description here

你可以使用 Ctrl+n 来浏览下一页,使用 Ctrl+p 来浏览上一页。你可以通过在所需的运行级别上选择 SPACE 来启用和禁用服务。

Jobs-Admin

另一种选择是通过安装 Jobs-Admin 来实现。

sudo apt-get install jobs-admin

这也提供了像这样的图形用户界面

jobs-admin preview

为了显示更多的工作,你必须在菜单中勾选“显示受保护的工作”。

chkconfig

另一个选项是chkconfig
sudo apt-get install chkconfig

可以通过命令行界面CLI的chkconfig来使用,它会显示开启/关闭任务的列表。 同时,我们还可以使用chkconfig –list来查看系统服务。

可以使用以下方式开启服务:

chkconfig <service> on

服务可以通过关闭来停用

chkconfig <service> off

我们甚至可以添加自己的服务,使用适当的初始化脚本和适当的标题。
chkconfig --add <service>

update-rc.d

另一个选择可以参考这里的update-rc.d,简要解释在这里
请注意,在Ubuntu Server 12.04中,update-rc.d代替了chkconfig。

1在Ubuntu服务器上:“包chkconfig不可用,但被另一个软件包引用。” - pwned
@pwned 您可以自由编辑和发布有关服务器版本的更新信息。谢谢。 - atenz
我按照你的建议去做了,现在就等待同行评审。 - pwned
jobs-admin 不允许更改工作(Ubuntu 14.04),而是生成一个崩溃报告;-) - Sadi
5sysv-rc-conf不适用于upstart或systemd,显然它只适用于旧的System 5 rc系统,这在Ubuntu Linux上已经不是默认选项了将近十年。Debian Bug #791689承认了这一点,并质疑为什么它没有被标记为与systemd冲突。 - JdeBP
sysv-rc-conf在17.04 Zesty中没有当前版本发布。 - noobninja

对于那些通过ssh运行Ubuntu的人来说,我认为最好的选择是rcconf - 一个基于文本的程序。
sudo apt-get install rcconf
sudo rcconf

alt text

使用Tab键和箭头键进行导航,按空格键启用/禁用。更改将在重新启动后保持。
截图来自this blogpost,该博文还展示了sysv-rc-conf - 一种类似的工具,也可以让您设置运行级别。(对于那些对运行级别足够关心以希望更改它们的人来说 :))
不幸的是,rcconf无法与upstart(列在/etc/init/*中的服务)一起使用,只能与传统机制(ls -l /etc/init.d/* - 那些不是符号链接的服务)一起使用。
幸运的是,当通过ssh登录到服务器时,许多相关的服务(Apache、Tomcat、mdadm、boinc-client等)尚未迁移到upstart。

6这个还能在upstart上运行吗? - oKtosiTe
3很遗憾,不行。但对我想要更改的所有情况都起作用 - 启动作业似乎主要是我从未想要禁用的东西 - 硬件时钟、日志守护程序、网络等(至少在Ubuntu服务器上)。但这是需要注意的事情(我没有意识到:), 我已更新了帖子。 - j-g-faustus
很不幸,MySQL已经转换为Upstart。而这是我只在做一些项目时才使用的服务。 - MestreLion
在Ubuntu 12.04上的rcconf存在一个错误,导致程序无法启动。要解决这个问题,您需要安装dialog软件包。 - devius
@devius 你也可以通过使用 sudo ln -s /bin/whiptail /usr/bin/whiptail 来解决那个错误。 - Mahn
1自从这个答案写出来以后,update-rc.d已经发生了变化,并且删除了一些已弃用的功能。Debian bug #727735指出rcconf没有进行相应的更改。而且,rcconf也不能与systemd一起使用,因此在过去十年里,它都不适用于Ubuntu Linux的默认初始化系统。 - JdeBP

我发现在Bionic版本之前,有一个类似于BUM但与Upstart兼容的GUI工具:Jobs-Admin。
sudo apt-get install jobs-admin

但这太简单了,而且不允许改变“受保护的工作”(那是什么工作?苹果有乔布斯,操作系统有守护进程!) - kakaz
我甚至不允许更改“未受保护的工作”(Ubuntu 14.04),而是生成一个崩溃报告;-) - Sadi

编辑现有的upstart配置文件(如上所述)并不是一个好主意。更新的软件包可能会提供更新的配置,这样你就不得不一遍又一遍地重复你的更改。
通过查看man 5 init,你会找到一个更合适的解决方案:使用覆盖配置。简单的例子:假设我们有一个名为"foobar"的服务,那么就会有一个名为/etc/init/foobar.conf的文件,其中包含它的upstart配置。现在你既不想删除该文件,也不想修改它,但你也不希望这个服务运行?那么就在它旁边放置一个override文件:/etc/init/foobar.override,其中包含(可选的描述头部)以及代替start on / stop on行的一行单词:manual。这样你告诉upstart基本上使用foobar.conf,但覆盖启动定义,只有在手动强制执行时才启动该服务(例如通过service foobar start)。


1别忘了检查一下“高级”按钮。 - not2qubit
没有适用于arm64的任何发布吗? - Vitalicus
1@Vitalicus 我对arm64不太了解。1)KDE Plasma(支持arm64架构)有一个名为“系统设置>背景服务”的选项,2)也许可以尝试构建Stacer:https://github.com/oguzhaninan/Stacer - Sadi
1@Vitalicus 我刚刚在官方的Debian软件库中找到了Stacer(它提供了与之相同的功能以及许多其他系统维护功能),支持arm64架构:https://packages.debian.org/bookworm/stacer 或者 https://packages.debian.org/bullseye/stacer - Sadi

对于我来说,最简单的方法是使用命令行界面(CLI),使用update-rc.d命令。
要启用或禁用自动重启等功能:
sudo update-rc.d <daemon|service> <enable|disable>

例子:
update-rc.d spamassassin enable

停止或启动一个守护进程,或者检查其状态:
sudo service <daemon|service> <start|stop|restart|reload|force-reload|status>

例子:
sudo service spamassassin status
  spamassassin.service - Perl-based spam filter using text analysis
   Loaded: loaded (/lib/systemd/system/spamassassin.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-05-21 13:04:10 SAST; 4s ago
  Process: 1928 ExecStart=/usr/sbin/spamd -d --pidfile=/var/run/spamd.pid $OPTIONS (code=exited, status=0/SUCCES
 Main PID: 1949 (spamd)
    Tasks: 3 (limit: 2361)
   CGroup: /system.slice/spamassassin.service
           ├─1949 /usr/bin/perl -T -w /usr/sbin/spamd -d --pidfile=/var/run/spamd.pid --create-prefs --max-child
           ├─1951 spamd child
           └─1952 spamd child`  etc  etc

update-rc.d可以做更多的事情,而不仅仅是上面显示的基本功能:

usage: update-rc.d [-f] <basename> remove
       update-rc.d [-f] <basename> defaults
       update-rc.d [-f] <basename> defaults-disabled
       update-rc.d <basename> disable|enable [S|2|3|4|5]
        -f: force

一如既往,您可以参考manpage

我使用Stacer
Stacer是一个开源的系统优化和应用程序监控工具,帮助用户管理整个系统的各个方面,它是一个集成了所有功能的系统实用工具。
它还显示服务和进程。一个完整的图形用户界面系统工具箱。