如何启用或禁用服务?


821

我读到有关如何在Ubuntu中启用和禁用服务的信息,似乎有多种管理它们的可能性。

我发现的第一种方法是update-rc.d向启动添加新服务,该服务针对/etc/init.d文件夹及其内容。

我发现的另一个是编辑.conf文件/etc/init夹中的文件。

建议启用/禁用/添加服务的方法是什么?为什么?

您能否给出一个简短的防弹逐步示例,说明如何在Ubuntu中添加服务以及启用和禁用该服务?



对于那些被Fedora 12困住并落在这里的人很有帮助。万一linkrot chkconfig是您想要的。
流血的手指

3
请注意,此处仍然缺少Ubuntu 14.04的答案。
Reinier Post 2015年

2
@MarcelloNuccio:从Ubuntu 15.04开始,不推荐使用Upstart,而推荐使用Systemd。
Dan Dascalescu

自动启动程序的配置autostart清单或*.service文件,在几个地点,以及在init.dcrontab。参见:unix.stackexchange.com/a/525845/43233
Noam Manos

Answers:


831

有些服务可以使用GUI(例如startup应用程序)或终端来启用/禁用。

对于终端,您有几种选择。首先,打开一个终端(例如,在破折号中键入“ terminal”,然后将其打开)。然后:

临时启用/禁用服务

暂时停止和启动服务(请勿在以后的启动中启用/禁用它们),您可以输入service SERVICE_NAME。例如:

  • sudo service apache2 stop(将停止 Apache服务,直到重新启动或再次启动它为止)。

  • sudo service apache2 start(假设以前已停止,则将启动 Apache服务。)。

  • service apache2 status (如果服务已启用/正在运行,或者已禁用/未运行,则将告诉您该服务的状态。)。

  • sudo service apache2 restart(将重新启动该服务。当您更改了配置文件后,将最常使用该服务。在这种情况下,如果您更改了PHP配置或Apache配置。重新启动将使您不必通过2个命令行来停止/启动)

  • service apache2(在这种情况下,由于您没有提到要为该服务执行的ACTION,它将向您显示该特定服务可用的所有选项。)这方面取决于服务,例如,对于MySQL,它只会提及它缺少参数。对于诸如网络服务之类的其他服务,将提及所有可用选项的小清单。


系统化

从Ubuntu 15.04开始,不推荐使用Upstart,而推荐使用Systemd。使用Systemd管理服务,我们可以执行以下操作:

systemctl start SERVICE-使用它来启动服务。重新启动后不持久

systemctl stop SERVICE-使用它停止服务。重新启动后不持久

systemctl restart SERVICE -使用它重新启动服务

systemctl reload SERVICE -如果该服务支持,它将重新加载与其相关的配置文件,而不会中断正在使用该服务的任何进程。

systemctl status SERVICE-显示服务状态。告知服务当前是否正在运行。

systemctl enable SERVICE-在下次重新启动或下次启动事件时打开服务。重新启动后,它仍然存在。

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。它还会告诉我们服务是否尚未转换为新贵:

转换后的服务通常会输出当前状态(正在启动,正在运行,正在停止...)和进程ID。未转换的服务将给出有关未知作业的错误。

某些快捷方式可能仅适用于service上面的命令,而不适用于下面的命令,除非将它们100%转换为新贵服务:

  • 开始 -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服务置于manual模式。如果您不希望这样做,那么之后您只需

sudo rm /etc/init/mysql.override

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


您需要添加.service到每个命令中吗?systemctl mongod status工作得很好。
Dan Dascalescu

@DanDascalescu不,你不,但我要在那里澄清一下。
路易斯·阿尔瓦拉多

4
是否应将.override文件放置在/etc/init.d/中,即服务所在的位置?
Obi Wan-PallavJha

为什么在15.04中不推荐使用Upstart?在ubuntu 16.04或更高版本中启动/重新启动时运行脚本的正确方法是什么?
Kamalakannan J

1
感谢您的全面答复。该systemd命令集在Ubuntu 18.04上有效。
Doktor J

355

当前,在Ubuntu,SysVUpstartsystemd中,实际上有三种方法可以将软件作为服务启动。服务在这里定义为由系统在后台运行的程序,而不是由用户直接启动并运行的程序。

SysV

在Linux中启动服务的传统方式是在中放置脚本/etc/init.d,然后使用update-rc.d命令(或在基于RedHat的发行版中chkconfig)启用或禁用该脚本。

该命令使用一些复杂的逻辑在中创建符号链接/etc/rc#.d,以控制启动服务的顺序。如果运行ls /etc/rc2.d,则可以看到命令将以文件名终止K##xxxx并以文件名开头的顺序S##xxxx。将##S##xxxx表示“启动顺序”的服务xxxx。相反,##in K##xxxx表示服务的终止命令xxxx

SysV的一个主要问题是,启动系统时,所有工作都必须串行进行,一件又一件地完成,这使得系统启动时间确实很慢。尝试将其并行化,但是它们是偶然的并且难以充分利用。这是创建Upstart的主要原因。

暴发户

Upstart使用作业定义文件/etc/init来定义应在什么事件上启动服务。因此,在系统启动时,新贵将处理各种事件,然后可以并行启动多个服务。这使他们可以充分利用系统的资源,例如,在运行另一个受CPU限制的服务时或在网络等待分配动态IP地址时启动磁盘绑定的服务。

您可以通过运行查看所有新贵作业文件 ls /etc/init/*.conf

让我在这里停下来说,如果您不知道服务是什么或服务是什么,请不要禁用它!

并非所有服务都已转换为新贵。在过去的几个月中,在Canonical的服务器团队工作时,我已经处理了许多转换后的作业文件,最棒的部分是它使人们可以摆脱所有脚本“魔术”,而只需将其放到在这里和那里几乎没有几个命令可以确切地定义如何启动服务,仅此而已。但是目前,只有很少的传统网络服务(如squidsamba)已被转换。

服务是基于新贵的吗?

为了确定服务是否基于新贵,您可以运行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

在暴发户中禁用服务(工作)

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

如果您仍然希望能够手动启动它,则需要注释掉该start on条件。假设您要安装samba,但没有使其自动启动。这是作业文件(以自然形式显示):

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

从开始/停止节禁用服务(自11.04开始)

从版本为11.04的upstart开始,有一个新关键字禁用了start onand stop on节:manual。因此,从11.04开始禁用服务的另一种方法是:

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

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

您只需创建关键字,就可以创建一个override文件来禁用服务,而无需完全编辑作业定义manual


20
看起来11.04也已覆盖。所以,echo manual >> /etc/init/<service>.override当它离开原来的.conf filke完整是首选。无论如何,这样一个基本的启用/禁用花了3年的时间开发仍然很可惜,并且没有GUI。
MestreLion

3
update-rc.d真正重要的是
Timofey 2012年

2
与原始问题发布者标记为最终答案的答案相比,似乎更容易理解原始主题。谢谢!:)
Henning

1
在我的情况下,该文件/etc/init/ssh.conf而存在status ssh,并status sshd都表示“未知作业”。这个答案似乎没有解决这种可能性?
Brian Z

1
status ssh也给了我“未知的工作”,但service ssh status对我
有用

129

sysv-rc-conf

尝试使用sysv-rc-conf

sudo apt-get install sysv-rc-conf

并开始管理服务,执行

sudo sysv-rc-conf

这样会弹出交互式窗口

在此处输入图片说明

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

职位管理员

另一个可选的是 乔布斯管理员通过安装

sudo apt-get install jobs-admin

其中也提供了这样的GUI

作业管理员预览

要显示更多作业,您必须在其菜单上勾选显示受保护的作业

chkconfig

第三个选项是chkconfig

sudo apt-get install chkconfig

它可以通过CLI使用chkconfig,显示开/关作业列表。我们也可以使用以下方式查看系统服务chkconfig –list

可以使用打开服务

chkconfig <service> on

可以使用关闭服务

chkconfig <service> off

我们甚至可以使用带有适当标题的适当初始化脚本来添加自己的服务。

chkconfig --add <service>

更新rc.d

另一个选项可以在这里参考update-rc.d在此简要说明。

请注意,对于Ubuntu Server 12.04,update-rc.d 使用而不是chkconfig。


1
Ubuntu的服务器上:Package chkconfig is not available, but is referred to by another package.
PWNED

@pwned您可以自由编辑和发布有关服务器版本的更新信息。谢谢。
atenz

我按照您的建议做了,现在可以进行同行评审了。
PWNED

Jobs-admin不允许更改工作(Ubuntu 14.04),而是提供当机报告;-)
Sadi 2014年

5
sysv-rc-conf不适合与upstart或systemd一起使用,它专利仅适用于旧的System 5 rc系统,近十年来它一直不是Ubuntu Linux上的默认系统。Debian Bug#791689承认了这一点,并质疑为什么它没有被标记为与systemd冲突。
JdeBP 2015年

48

对于那些通过ssh运行Ubuntu的人,我认为最好的选择是rcconf-基于文本的程序:

sudo apt-get install rcconf
sudo rcconf

替代文字

使用Tab键和箭头键浏览,然后按空格键启用/禁用。更改在重新启动后将保持不变。

从此博客文章中借来的屏幕快照,屏幕快照还显示sysv-rc-conf-类似的工具,该工具还可让您设置运行级别。(对于那些恰好在乎运行级别以希望更改它们的人:)

不幸的是,rcconf不适用于新贵(列出的服务/etc/init/*),仅适用于传统机制(ls -l /etc/init.d/*-不是符号链接的服务)。

幸运的是,在ssh-in到服务器时,许多与之相关的服务(Apache,Tomcat,mdadm,boinc-client ...)尚未移交给新贵。


6
这仍然适用于新贵吗?
2011年

3
抱歉不行。但这在我想更改的所有情况下都有效-新贵的工作似乎是我永远不想禁用的事情-硬件时钟,日志守护程序,网络等(至少在Ubuntu服务器上)。但是有一点要注意(我不是:),我已经更新了帖子。
jg-faustus

不幸的是,mysql被转换为新贵。那就是我仅在执行某些项目时使用的服务。
MestreLion

Ubuntu 12.04上的rcconf有一个错误,阻止该程序启动。要解决此问题,您需要安装对话框包。
devius

1
自从编写了此答案以来,update-rc.d就进行了更改,并且删除了一些不推荐使用的功能。Debian错误#727735指出rcconf并未更改为匹配。而且,rcconf也不能与systemd一起使用,因此在过去十年中不适用于Ubuntu Linux的任何默认初始化系统。
JdeBP

18

我发现有这个GUI工具,类似于BUM,但与Upstart兼容:

  • 职位管理员

    sudo apt-get install jobs-admin
    

但这太简单了,不允许更改“受保护的作业”(那是jobbs?Apple有Jobs,操作系统有守护进程!)
kakaz 2013年

我什至不允许更改“不受保护的工作”(Ubuntu 14.04),而是提供崩溃报告;-)
Sadi 2014年

12

编辑现有的新贵配置文件(如上所述)不是一个好主意。更新的软件包可以提供更新的配置,并且您不得不一遍又一遍地重复所做的更改。

看一看,man 5 init会发现一个更合适的解决方案:使用重写配置。简短示例:假设我们有一个名为“ foobar”的服务,那么将有一个名为/etc/init/foobar.confupstart的配置文件。现在,您不想删除该文件,也不想对其进行修改,但是您既不想运行此服务,又不想?因此,在它旁边放置一个替代文件:/etc/init/foobar.override,其中包含(可选的是带有说明的标头和),而start on/ stop on行则用一个单词放置一行:manual。这样,您可以告诉upstart基本上使用foobar.conf,但是覆盖启动定义以仅在手动执行时启动该服务(service foobar start在我们的示例中)。



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.