问题描述
我阅读了关于如何在Ubuntu中启用和禁用服务,似乎有不同的可能性来管理它们。
我找到的第一个方法是update-rc.d
,用于向启动添加新服务,该服务针对/etc/init.d
文件夹及其内容。
另一个我发现是编辑/etc/init
文件夹中的.conf
文件。
推荐/禁用/添加服务的方式是什么?为什么?
您能否简单介绍一下如何在Ubuntu中添加服务并启用和禁用它?
最佳解决方法
有些服务可以使用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时,它只会提及它缺少一个参数。对于网络服务等其他服务,它会提及所有可用选项的小列表。
SYSTEMD
从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
– 这会告诉我们转换的服务是否正在运行。请注意,这是不赞成start
,stop
,status
& restart
。它还会告诉我们一项服务是否尚未转化为新贵:
转换的服务通常会输出当前状态(启动,运行,停止…)和进程ID。未经转换的服务会给出未知作业的错误。
有些快捷方式可能只适用于上面的service
命令,但不能与下面的命令一起使用,除非它们100%转换为upstart服务:
-
开始 –
sudo start mysql
-
STOP –
sudo stop mysql
-
RESTART –
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或其他,它们会在完成安装后自动启动,并在每次启动计算机时启动。如上所述,禁用将使用服务manual
。
次佳解决方法
目前,在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
的”start order”。相反,K##xxxx
中的##
表示服务xxxx
的终止订单。
SysV的一个主要问题是启动系统时,everything had to be done in serial, one thing after another, making system boot times really slow。试图将其并行化,但它们杂乱无章,难以充分利用。这是Upstart创建的主要原因。
Upstart
Upstart使用/etc/init
中的作业定义文件来定义应启动服务的事件。因此,在系统启动时,新贵会处理各种事件,然后可以并行启动多个服务。这使他们能够充分利用系统的资源,例如,在另一个CPU-bound服务运行时启动disk-bound服务,或者在网络正在等待分配动态IP地址时启动disk-bound服务。
您可以通过运行ls /etc/init/*.conf
来查看所有暴发的作业文件
让我停下来说,如果你不知道服务是什么,或者它做了什么,不要禁用它!
并非所有服务都已转换为新贵。在过去的几个月中,在Canonical的服务器团队中工作时,我已经处理了大量转换后的作业文件,最好的部分是它允许摆脱所有脚本”magic”,并只需输入几个命令在这里和那里准确地定义如何启动服务,仅此而已。但目前,只有少数传统的网络服务,如squid和samba已经被转换。
是服务upstart-based?
为了确定服务是否为upstart-based,可以运行status命令:
status servicename
如果这是一个暴发户的工作,它会显示这一点:
$ status statd
statd start/running, process 942
但如果不是,你会看到更像这样的东西:
$ status apache2
status: Unknown job: apache2
在这种情况下,apache2
尚未转化为新贵。因此,要禁用apache2
,您只需运行
sudo update-rc.d apache2 disable
sudo service apache2 stop
新贵禁用服务(工作)
Upstart作业定义没有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
但是,如果你不想让桑巴开始,我会建议实际上删除这个包。但是,如果您希望安装它,但无法启动,还可以执行以下操作:
mv /etc/init/smbd.conf /etc/init/smbd.conf.disabled
使用开始/停止节停用服务(截至11.04)
从11.04版本的新贵开始,会有一个新的关键字禁用start on
和stop on
节:manual
。因此,另一种禁用11.04服务的方法是:
echo 'manual' | sudo tee /etc/init/mysql.override
# command from root shell
echo manual >> /etc/init/mysql.override
只需放入manual
关键字,就可以创建override
文件来禁用服务,而无需编辑作业定义。
第三种解决方法
sysv-rc-conf
尝试使用sysv-rc-conf
sudo apt-get install sysv-rc-conf
并开始管理服务,执行
sudo sysv-rc-conf
这将带来这样的交互式窗口
您可以使用下一页的Ctrl+n
和上一页的Ctrl+p
进一步浏览页面。您可以通过在所需运行级别上选择SPACE
来启用和禁用服务。
Jobs-Admin
另一种替代方案是通过安装通过Jobs-Admin
sudo apt-get install jobs-admin
其中也提供了这样的GUI
为了显示更多作业,您必须在其菜单中勾选显示受保护的作业。
chkconfig
第三个选项是chkconfig,
sudo apt-get install chkconfig
它可以通过CLI chkconfig
使用,显示开/关作业列表。我们也可以使用chkconfig –list
查看系统服务
服务可以打开使用
chkconfig <service> on
服务可以使用关闭
chkconfig <service> off
我们甚至可以添加我们自己的服务,使用正确的init脚本和正确的标题。
chkconfig --add <service>
update-rc.d
另一个选项可以参考here update-rc.d,简要解释为Chkconfig替代Ubuntu服务器?。
请注意,对于Ubuntu Server 12.04,update-rc.d
is used instead of chkconfig.
第四种方法
对于那些通过ssh运行Ubuntu的人,我认为最好的选择是rcconf
–一个基于文本的程序:
sudo apt-get install rcconf
sudo rcconf
使用选项卡和箭头键导航,按空格键启用/禁用。更改在重新启动时保持不变。
从this blogpost借用的屏幕截图,也显示了sysv-rc-conf
– 一个类似的工具,可以让你设置运行级别。 (对于那些碰巧关心运行级别的人,希望改变它们:)
不幸的是,刚刚使用传统机制(ls -l /etc/init.d/*
–不是符号链接),rcconf不适用于新贵(/etc/init/*
中列出的服务)。
幸运的是,当ssh-ing进入服务器(Apache,Tomcat,mdadm,boinc-client …)时,许多与这些服务相关的服务尚未转移到新贵上。
第五种方法
我发现有这个GUI工具,像BUM,但与Upstart兼容:
-
Jobs-Admin
sudo apt-get install jobs-admin
第六种方法
编辑现有的upstart配置文件(如上所述)并不是一个好主意。更新后的软件包可以提供更新的配置,并且您不得不一遍又一遍地重复更改。
通过查看man 5 init
,可以找到更合适的解决方案:使用覆盖配置。简单的例子:假设我们有一个名为”foobar”的服务,所以会有一个叫做/etc/init/foobar.conf
的文件,它的新配置。现在您不想删除该文件,也不想修改它 – 但是您不希望此服务运行?因此,在它旁边放置覆盖文件:/etc/init/foobar.override
,其中包含(可选择带有说明的标题),而不是start on
/stop on
行,您将一行放在一行中:manual
。通过这种方式,您可以立即开始基本使用foobar.conf
,但会覆盖启动定义,以便在手动执行时(通过本示例中的service foobar start
)启动该服务。
第七种方法
还有Boot-Up管理器。
要安装:sudo apt-get install bum
更多信息:http://www.marzocca.net/linux/bum.html
参考资料