介绍
本教程介绍如何配置系统服务以在崩溃或服务器重新启动后自动重新启动。
该示例使用MySQL,但您可以将这些原则应用于服务器上运行的其他服务,如Nginx,Apache或您自己的应用程序。
我们将介绍本教程中三个最常见的初始化系统,因此请务必按照您的分发版进行。 (许多发行版提供多个选项,或允许安装备用init系统)。
- 系统V是老初始化系统:
- Debian 6及更早版本
- Ubuntu 9.04及更早版本
- CentOS 5及更早版本
- Upstart :
- Ubuntu 9.10到Ubuntu 14.10,包括Ubuntu 14.04
- CentOS 6
- systemd是这里的特色最近发行初始系统:
- Debian 7和Debian 8
- Ubuntu 15.04及更高版本
- CentOS 7
您还可以检查出第2部分,参考文章 。
背景
您的运行Linux或Unix系统将有许多后台进程在任何时间执行。 这些方法-也被称为服务或守护程序 -可以是天然的操作系统,或作为应用程序运行的一部分。
操作系统服务示例:
- sshd守护进程,允许远程连接
- 控制印刷的cupsd守护进程
应用程序守护程序的示例:
- 的httpd / Apache2的是一个Web服务器服务
- mongod的是一个数据库后台进程
这些服务应该连续运行,以确保我们的网站,邮件,数据库和其他应用程序总是启动。
作为管理员,我们希望我们的Linux服务:
- 连续运行没有失败
- 在系统重新启动或崩溃后自动启动
然而,有时,这些服务下降,使我们的网站或应用程序不可用。
重新启动可能有多种原因:可能是计划重新启动,修补程序更新的最后一步或意外的系统行为的结果。 崩溃是当进程意外停止或对用户或应用程序请求无响应时发生的。
本文的目标是让您的服务重新启动并运行,即使在崩溃或重新启动后。
虽然有不可替代的连续监测和预警,Linux服务可以通过改变它们被服务管理守护程序,也被称为初始化系统处理的方式进行大多自愈。
没有单一的方法来做到这一点:这一切都取决于特定的Linux发行版和服务管理守护进程附带它。 许多常见操作系统的默认初始化系统显示在上面的介绍中。
我们将进入更多关于runlevels的细节在第2部分 ,但这篇文章,它会帮助理解每一个Linux系统在共同的四个基本运行级别:
- 0 - 运行级别0表示系统关闭
- 1 - 运行级别1表示单用户,救援模式
- 5 - 运行级别5表示多用户,启用网络,图形模式
- 6 - 运行级别6用于系统重新启动
一般来说,运行级别2,3和4意味着Linux在多用户,启用网络的文本模式下启动的状态。
当我们启用一个服务自动启动,我们实际上是将它添加到运行级别。
目标
在这个由两部分组成的教程中,我们将看到如何配置Linux服务以在系统重新启动或崩溃时自动启动。
本系列的第1部分将是一个快速运行,它将在三种不同的init(初始化)模式下进行:
- 系统V init(也称为经典init)
- Upstart
- systemd
在第二部分 ,我们将解释为什么我们跑的命令,他们在幕后是如何工作的。 我们将讨论每个init方法的启动脚本,重要文件和配置参数。 第2部分中的许多讨论可能似乎是理论上的,但将作为理解基础的有用参考。
第1部分将仅介绍设置自动重新启动的实际方面。
先决条件
要学习本教程,你需要创建一些DigitalOceanDroplet(或创建自己的Linux服务器),每个至少有1 GB的RAM。 我们不会去创造一个Droplet的细节,但你可以找到更多的信息在这里 。
我们将使用不同的分布为我们的例子。
- Debian 6 x64(需要这个较旧的操作系统来演示System V init系统)
- Ubuntu 14.04 x64(适用于Upstart)
- CentOS 7 x64(用于systemd)
- 您应该在每个服务器上设置一个sudo用户。 要了解sudo的权限是如何工作的,请参阅本DigitalOcean 有关启用sudo访问教程
我们建议您保持Droplet按照本教程的第一部分后,因为我们将使用相同的设置为2部分 。
你不应该从本教程制作Linux服务器上运行任何命令,查询,或配置。我们将打乱服务测试的一部分,你不希望你的在线服务器打嗝。
使用System V自动启动服务
让我们开始讨论System V init,这里讨论的最古老的init系统。
- Debian 6及更早版本
- Ubuntu 9.04及更早版本
- CentOS 5及更早版本
与System V,可以安装最标准的应用程序,如Nginx的或MySQL,默认情况下将重启后启动 ,但默认情况下崩溃后无法启动 。 他们将带着自己的初始化脚本/etc/init.d
了。
对于自定义应用程序,您必须创建自己的初始化脚本,并使服务自动启动。
创建自己的初始化脚本超出了本文的范围,但您可以参考现有的示例脚本,以帮助您构建自己的,如果需要的话。 系统V使用Bash作为init脚本。
系统V的自动启动清单
本节是一个快速参考,以确保您的服务设置为自动启动。
配置清单
- 确保服务具有位于功能的Bash初始化脚本
/etc/init.d/service
- 使用
update-rc.d
命令启用该服务(或为CentOS系统,chkconfig
):
sudo update-rc.d service enable
- 这应该创建一个符号链接
/etc/rc2.d
看起来像以下( 不手动创建此):
lrwxrwxrwx 1 root root 15 Jul 31 07:09 S02mysql -> ../init.d/service
请注意,您也应该看到,从目录链接/etc/rc3.d
通过/etc/rc5.d
; 了解这些数字的时候,我们讨论运行级别 。
- 添加
respawn
在底部的这一服务/etc/inittab
文件。 这里有一个通用的例子:
id:2345:respawn:/bin/sh /path/to/application/startup
- 停止,然后启动,服务:
sudo service service stop
sudo service service start
- 重新启动服务器。
sudo reboot
测试
要测试这些工作是否正常,您可以:
- 重新启动服务器,然后验证服务是否已启动
- 搜索进程号:
ps -ef | grep service
- 杀死过程:
sudo kill -9 process_number
- 等待五分钟,然后验证服务是否已备份
第1步 - 连接到您的Debian 6 Droplet
现在我们将通过一个实际的例子,使用MySQL。
从DigitalOcean控制面板,创建1 GB的RAM一个Debian 6.0 64Droplet。
一旦Droplet被初始化,使用SSH连接到服务器(Windows用户可以使用像PuTTY这样的工具连接)。
ssh sammy@your_server_ip
在以下说明中,我们假设您的帐户具有sudo权限。
第2步 - 安装MySQL
我们将使用MySQL作为我们的测试服务。 执行下一个命令安装MySQL服务器:
sudo apt-get install mysql-server -y
将显示如下所示的图形屏幕,要求输入新的root密码。 提供:
在下一个提示中重复密码:
按ENTER
确认。
安装MySQL时,行将滚动。 安装完成后,运行以下命令强化安装:
mysql_secure_installation
这将要求当前的root密码。 按N
保持相同的密码。 然后,按Y
删除匿名用户,禁用远程root登录,并删除测试数据库。 最后,按Y
重装授权表。
我们的MySQL安装现在应该完成。
要检查服务是否正在运行,请执行以下命令:
service mysql status
输出将显示几行信息,其中一个将显示MySQL服务已运行多长时间(正常运行时间)。
Output/usr/bin/mysqladmin Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64
. . .
Uptime: 4 days 18 hours 58 min 27 sec
Threads: 1 Questions: 18 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 8 Queries per second avg: 0.0.
第3步 - 配置MySQL重新启动后自动启动
默认情况下,MySQL已经设置为在重新启动后启动。
你应该可以看到这个符号链接到MySQL的初始化脚本在/etc/rc2.d
的目录。 需要注意的是,你不应该试图手动创建符号链接这些; 使用update-rc.d
命令启用和禁用服务。
ls -l /etc/rc2.d
Outputlrwxrwxrwx 1 root root 15 Jul 31 07:09 S02mysql -> ../init.d/mysql
只要有一个S
该服务的默认运行级别目录下的脚本,init将启动该服务的服务器启动时。
所以,MySQL应该运行。 现在是时候验证它将在启动时自动启动。 使用以下命令重新启动机器:
sudo reboot
服务器恢复在线后,使用SSH连接到服务器。
运行service mysql status
再次命令。 同样,该服务将显示为正在运行。 这意味着服务在操作系统引导时自动启动。
不是所有的服务都会是这样的,但。 在这些情况下,我们将必须手动配置服务以进行自动重新启动。 对于Debian的update-rc.d
命令,您可以添加(或删除)服务在系统启动时自动启动。
让我们禁用MySQL服务,然后看看如何重新启用它自动启动。 让我们运行这个命令来禁用MySQL:
sudo update-rc.d mysql disable
要测试,请重新启动服务器。
sudo reboot
使用SSH连接到服务器。
尝试使用MySQL客户端工具连接到MySQL:
mysql -u root -p
您将收到此消息:
OutputERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
重新启用服务:
sudo update-rc.d mysql enable
输出将是:
Outputupdate-rc.d: using dependency based boot sequencing
如果您运行的是CentOS系统与System V,命令将使用chkconfig
,而不是update-rc.d
。
请注意,在启动时启用自动启动服务不会在停止时自动启动。 要启动MySQL,请运行以下命令:
sudo service mysql start
第4步 - 配置MySQL崩溃后自动启动
现在我们的服务再次运行,让我们看看它是否在崩溃后自动启动。 与System V,它不会在默认情况下自动出现。
我们将通过突然杀死进程来模拟崩溃。 通过执行以下命令找到其进程ID:
ps -ef | grep mysql
输出将类似于:
Outputroot 1167 1 0 07:21 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 1292 1167 0 07:21 pts/0 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root 1293 1167 0 07:21 pts/0 00:00:00 logger -t mysqld -p daemon.error
root 1384 1123 0 07:21 pts/0 00:00:00 grep mysql
运行MySQL的主要过程是mysqld_safe
和mysqld
。 mysqld_safe
是父进程mysqld
。
在我们的示例中,我们可以看到它们分别具有进程ID 1167和1292。 他们的过程编号以红色突出显示。
让我们来模拟碰撞与kill -9
命令。 请确保使用您自己的进程ID:
sudo kill -9 1167
sudo kill -9 1292
检查服务状态:
sudo service mysql status
输出将显示服务已停止:
OutputMySQL is stopped..
现在我们的服务已经崩溃,我们如何提高它? 当然,我们可以重新启动它,但这将是一个手动过程; 我们希望自动重新启动。 为了使MySQL自动重启崩溃后,我们需要编辑/etc/inittab
的文件。
我们将谈论的/etc/inittab
更详细地在第2部分文件,但现在,让我们明白,系统重新启动时的第一个文件系统V init读取。
除此之外, /etc/inittab
决定,如果它崩溃的过程应该如何表现。 对于某些进程,它意味着重新启动服务。 我们需要确保MySQL是这些服务之一。 所以让我们先复制一下:
sudo cp /etc/inittab /etc/inittab.orig
务必注意:在编辑时要非常小心, /etc/inittab
的文件。 如果您在命令中出错或删除任何现有配置,则重新启动系统时可能不会出现。
打开/etc/inittab
使用文本编辑器:
sudo nano /etc/inittab
在文件的末尾,添加以下行:
ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe
那么我们在这里做什么?
好了,我们是在把一个命令/etc/inittab
的文件重生的mysqld_safe process
,当它崩溃。 它有四个字段,每个字段与冒号(:)分隔开。
-
ms:
前两个字符指定进程的ID。 -
2345:
第二个字段指定它应该适用于运行级别 。 在这种情况下,它是运行级别2,3,4和5 -
respawn:
第三个字段指定的动作 (我们重生的服务) -
/bin/sh /usr/bin/mysqld_safe
:最后,第四场是过程 (执行命令)
我们会回来的/etc/inittab
更详细的文件在第2部分,看看它是如何与一个崩溃后自动启动MySQL的帮助。 现在,保存文件并退出编辑器。
重新启动服务:
sudo service mysql start
重新启动服务器,以使更改生效:
sudo reboot
现在,重复的命令来查找进程号,杀进程,并再次检查状态,从ps -ef | grep mysql
ps -ef | grep mysql
。
等待五分钟左右,然后执行命令:
sudo service mysql status
你应该看到这一次,MySQL已经在崩溃后自动启动。
而已! MySQL现在将在服务崩溃或系统重新启动后自动启动。
使用Upstart自动启动服务
Upstart是另一个init方法,它首先在Ubuntu 6中引入。它成为Ubuntu 9.10中的默认方法,后来被应用到RHEL 6及其衍生产品中。 Google的Chrome操作系统也使用Upstart。
- Ubuntu 9.10到Ubuntu 14.10,包括Ubuntu 14.04
- CentOS 6
虽然在目前的LTS版本的Ubuntu(14.04在写作时),它正在强大,它被逐步淘汰到所有地方支持systemd,我们在最后一节。
Upstart在处理系统服务方面优于System V,也很容易理解。 但是,我们不会深入地介绍本教程的这部分Upstart; 有一对Upstart非常好的教程在DigitalOcean社区。
今天我们将主要关注Upstart配置文件,并了解如何使用它们来自动启动服务。
Upstart使用配置文件来控制服务。 该文件是根据/etc/init
目录中。 该文件的纯文本内容,方便阅读的部分称为节 。 每节描述了服务的不同方面以及它应该如何运行。
默认情况下,你可以安装诸如Nginx的或MySQL最标准的应用程序,将重新启动后开始 ,默认情况下也崩溃后启动 ,所以你没有做任何事情来使这项工作。 他们将带着自己的初始化脚本/etc/init
了。
对于自定义应用程序,您必须自己设置。 要了解如何创建自己的自定义脚本Upstart,请阅读入门Upstart教程前面提到。
Upstart的自动启动清单
本节是一个快速参考,以确保您的服务设置为自动启动。
配置清单
- 请确保该服务的功能Upstart的init脚本位于
/etc/init/ service .conf
- 将
/etc/init/ service .conf
文件应包含这样一行start on runlevel [2345]
重新启动后启用自动启动 - 将
/etc/init/ service .conf
文件还应该包含这样一行respawn
,使服务崩溃后重生
- 将
- 确保有该服务没有覆盖文件 :
/etc/init/ service .override
(只有当你或另一个管理员先前创建了一个)
- 停止,然后启动,服务:
sudo initctl stop service
sudo initctl start service
- 重新启动服务器。
sudo reboot
测试
要测试这些工作是否正常,您可以:
- 重新启动服务器,然后验证服务是否已启动
- 搜索进程号:
ps -ef | grep service
- 杀死过程:
sudo kill -9 process_number
- 在几秒钟内,验证服务是否已备份
第1步 - 连接到您的Ubuntu 14.04 Droplet
我们将使用运行MySQL的Ubuntu 14.04服务器来演示Upstart。
创建1 GB RAM的Droplet,选择的Ubuntu 14.04 64位为基准图像。
使用SSH连接到服务器(Windows用户可以使用像PuTTy这样的工具进行连接)。
ssh sammy@your_server_ip
在以下说明中,我们假设您的帐户具有sudo权限。
第2步 - 安装MySQL
现在我们将安装MySQL。
执行下一个命令来更新软件包列表:
sudo apt-get update
安装MySQL服务器:
sudo apt-get install mysql-server -y
为MySQL创建一个新的root密码,并在出现提示时进行确认。
安装完成后,运行mysql_secure_installation
命令:
mysql_secure_installation
提供与在Debian中安装时的提示相同的答案(参见前面的部分)。
第3步 - 配置MySQL重新启动后自动启动
默认情况下,MySQL将在重新启动后自动启动。 查看其配置是很有用的,因此您可以通过这种方式设置自己的服务。
首先,让我们检查MySQL服务器进程是否正在运行:
sudo initctl status mysql
你应该看到这样的输出:
Outputmysql start/running, process 2553
重新启动服务器:
sudo reboot
当服务器恢复在线时,使用SSH重新连接。
检查MySQL的状态:
sudo initctl status mysql
输出将显示MySQL已自动启动。 所以,我们不必在这里做任何具体的事情来启用服务。
请记住,可能不适合,你必须通过在创建自己的Upstart文件手动启用服务其它应用守护进程的情况下/etc/init/
目录下。
此外,Upstart如何知道MySQL应该在重新启动时自动启动?
让我们来看看MySQL的Upstart init文件。 打开/etc/init/mysql.conf
在文本编辑器文件中:
sudo nano /etc/init/mysql.conf
Upstart文件不是我们在Debian机器上看到的shell脚本。
MySQL的init配置文件将具有启动前和启动后事件的脚本块。 这些代码块告诉Upstart系统当mysqld进程启动或已经启动时执行什么。
让我们仔细看看文件的前十行:
...
description "MySQL Server"
author "Mario Limonciello <superm1@ubuntu.com>"
start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]
respawn
respawn limit 2 5
我们可以看到MySQL应该从运行级别2,3,4和5开始,它不应该运行在运行级别0,1和6。
这是我们定义Upstart守护程序的服务启动行为的位置。 与System V的,我们使用了update-rc.d
或chkconfig
命令,我们使用的服务配置文件中的Upstart。 所有我们要做的是添加/更改start
节。 在第2部分中,我们将使用此文件,并查看启用和禁用MySQL服务如何影响此文件,反之亦然。
在respawn
指令重新启动该服务崩溃后,所以我们会在下一步讨论。
第4步 - 配置MySQL崩溃后自动启动
你应该还是有/etc/init/mysql.conf
打开。
在respawn
指令是不言自明:如果它崩溃MySQL将启动。 默认情况下已启用。
之后,该指令是更有意思: respawn limit
指令规定的Linux多少次尝试重新启动坠毁服务以秒为单位的时间间隔。 在这种情况下,第一个参数( 2
)是尝试次数,而第二个( 5
)为间隔。 如果服务在此阈值内未成功启动(重新启动),它将保持在停止状态。 这个合理的默认行为,因为如果一个服务持续崩溃,最好禁用它,而不是影响整个系统的稳定性。
现在,退出文本编辑器而不进行任何更改。
正如我们刚才看到的,默认情况下,MySQL也被配置为在崩溃后自动恢复。
为了测试这个,让我们检查服务PID:
sudo initctl status mysql
我们系统的新PID(重启后)应如下所示:
Outputmysql start/running, process 961
注意测试用例的进程ID。 接下来,通过杀死进程,模拟碰撞kill -9
命令,使用自己的进程号:
sudo kill -9 961
立即检查MySQL状态。 它应该运行(立即或在几秒钟内)与一个新的PID:
sudo initctl status mysql
在我们的例子中,新的PID是1552:
Outputmysql start/running, process 1552
如果你愿意,你可以再次杀死它。 它每次会再次来:
这是因为的发生respawn
在指令中mysql.conf
文件。
respawn
MySQL默认情况下具有在崩溃后重新启动的能力,但对于其他服务,您可能必须在Upstart文件中手动添加此指令。 再次,在第2部分中,我们将看到如何从配置文件更改崩溃行为。
使用systemd自动启动服务
systemd是Linux已经成为大多数新的Linux发行版的实际初始化守护进程的系统和服务经理 。
首先在Fedora中实现,systemd现在带有RHEL 7及其衍生物如CentOS 7. Ubuntu 15.04也提供了本地systemd。 其他发行版或者并入systemd,或者宣布它们很快。
- Debian 7和Debian 8
- Ubuntu 15.04
- CentOS 7
systemd与系统V命令和初始化脚本向后兼容。
这意味着任何System V服务也将在systemd下运行。 大多数Upstart和System V管理命令已修改为在systemd下工作。 这就是为什么它通常被称为一个下拉更换为System V启动。
随着systemd,可以安装最标准的应用程序,如Nginx的或MySQL,将在重启后开始 ,在默认情况下崩溃后也启动 ,所以你没有做任何事情来使这项工作。 他们将带着自己的初始化脚本/etc/systemd/system
了。
对于自定义应用程序,您必须创建自己的初始化脚本,并使服务自动启动。 我们不会进入什么这里进入详细的自定义初始化脚本的具体细节,但你可以在此阅读更多关于systemd 介绍systemd文章 。
systemd的自动启动清单
本节是一个快速参考,以确保您的服务设置为自动启动。
配置清单
- 确保服务具有位于功能systemd初始化脚本
/etc/systemd/system/multi-user.target.wants/ service .service
- 使用
systemctl
命令启用该服务:
sudo systemctl enable service.service
- 这应该创建一个符号链接
/etc/systemd/system/multi-user.target.wants/
看起来像以下( 不手动创建此):
lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/service.service -> /usr/lib/systemd/system/service.service
这将启用重新启动后自动启动。
- 该
/etc/systemd/system/multi-user.target.wants/ service .service
文件还应该包含这样一行Restart=always
下的[Service]
文件的部分,以使服务崩溃后重生 - 重新加载systemd守护程序,然后重新启动服务:
sudo systemctl daemon-reload
sudo systemctl restart service.service
测试
要测试这些工作是否正常,您可以:
- 重新启动服务器,然后验证服务是否已启动
sudo reboot
- 搜索进程号:
ps -ef | grep service
- 杀死过程:
sudo kill -9 process_number
- 在几秒钟内,验证服务是否已备份
第1步 - 连接到您的CentOS 7 Droplet
我们将使用CentOS 7和MySQL来展示如何配置systemd服务。
创建1 GB RAM的Droplet,然后选择CentOS 7 64位为基地的形象。
使用SSH连接到服务器(Windows用户可以使用像PuTTy这样的工具进行连接)。
ssh sammy@your_server_ip
我们假设您使用的是具有sudo权限的帐户。
第2步 - 安装MySQL
运行以下命令以下载并安装MySQL社区服务器repo:
sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
安装MySQL服务器:
sudo yum install mysql-server -y
安装完成后,启动mysqld服务。
(注意这和我们在Debian和Ubuntu下安装MySQL不一样,在其他版本中,MySQL自动启动。)
此外,我们使用的是一个新的名为systemd命令systemctl
控制服务:
sudo systemctl start mysqld
接下来,运行mysql_secure_installation
命令。
mysql_secure_installation
在这种情况下,MySQL root密码将为空,因此您应该选择创建新密码。 提供与在Debian或Ubuntu下安装时相同的其他提示的答案(有关详细信息,请参阅早期的Debian部分)。
第3步 - 配置MySQL重新启动后自动启动
默认情况下,MySQL配置为在重新启动后自动启动。 让我们看看这是如何工作的。
要检查是否mysqld
后台程序配置为在系统启动时自动启动,执行systemctl
用命令is-enabled
选项:
sudo systemctl is-enabled mysqld.service
结果将是:
Outputenabled
让我们重新启动机器:
sudo reboot
当服务器恢复时,使用SSH连接到它。
执行以下命令检查服务状态:
sudo systemctl status mysqld.service
输出将显示服务正在运行:
Outputmysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago
Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 661 (mysqld_safe)
...
要禁用服务,请运行以下命令:
sudo systemctl disable mysqld.service
这不会停止服务,但禁用它。 实际上,输出显示的符号链接已被删除:
Outputrm '/etc/systemd/system/multi-user.target.wants/mysqld.service'
rm '/etc/systemd/system/mysql.service'
如果你愿意,你可以重新启动服务器,并再次测试,看看MySQL服务器是否正在运行(它不会)。
或者,执行systemctl is-enabled
再次, 我们应该得到的响应disabled
:
sudo systemctl is-enabled mysqld.service
Outputdisabled
再次启用服务:
sudo systemctl enable mysqld.service
输出将显示正在重新创建的符号链接:
Outputln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service'
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'
您的服务将在重新启动后自动启动。
第4步 - 配置MySQL崩溃后自动启动
现在我们将看到MySQL如何配置为在崩溃后自动启动。
首先,打开mysqld.service
在编辑器单元文件(记住,systemd服务使用单位文件进行配置):
sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service
在文件的结尾,有一个重新启动指令:
[Unit]
...
[Install]
...
[Service]
...
...
Restart=always
...
的值Restart
参数设置为always
。 这意味着MySQL服务将重新启动以清除或不干净的退出代码或超时。
这是在systemd中定义自动重新启动的地方。
就像respawn
的Upstart指令, Restart
在systemd参数定义,如果它崩溃的服务应该如何表现。
并非所有systemd服务都默认启用此功能; 做上来崩溃后一种服务,我们所要做的就是下添加此额外的指令[Service]
服务单元文件的部分。 如果节头不存在,我们必须添加[Service]
头了。
要模拟崩溃,首先退出编辑器,然后检查MySQL进程ID:
sudo systemctl status mysqld.service
Outputmysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago
Main PID: 661 (mysqld_safe)
...
杀了这个过程中kill -9
信号。 在我们的例子中,主PID是661; 用您自己的PID替换PID:
sudo kill -9 661
检查状态:
sudo systemctl status mysqld.service
输出将显示MySQL已重新启动与一个新的PID(在我们的情况下,新的进程ID是11217):
Outputmysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago
Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 11217 (mysqld_safe)
...
...
所以你看到即使在崩溃后服务也出现了。
结论
在本教程的第一部分中,我们已经了解了如何将System V,Upstart和systemd服务配置为在重新引导或崩溃后自动启动。
我们还看到了控制此行为的文件,配置参数和命令。
这更是一个实践的介绍。 我们将在下一期系列中更详细地介绍这些概念和基础知识。
不要删除Droplet尚未-防止他们逃跑,我们将回到他们的下一部分 。