如何配置 Linux 服务在崩溃或重启后自动启动 – 第二部分:参考

作者选择了自由开源基金会作为 Write for Donations 计划的捐赠对象。

介绍

在本教程中,您将使用 systemd 配置 MySQL,在重启或崩溃后自动重新启动。

这是一个两部分系列的第二部分。第一部分涵盖了一般的 Linux 服务管理概念,如 init 守护进程和运行级别。它以 systemd 中的服务管理演示结束。在这里,您将研究 targetswantsrequiresunit 文件。第二部分提供了使用 MySQL 数据库的实际示例。

先决条件

要完成本教程,您需要:

  • 运行 CentOS 8 的服务器,包括一个具有 sudo 特权的非根用户。要设置所有这些内容,包括防火墙,您可以创建一个运行 CentOS 8 的 DigitalOcean Droplet,然后按照我们的初始服务器设置指南进行操作。

  • 已安装 MySQL。有关详细说明,请参阅我们的教程《在 CentOS 8 上安装 MySQL》。

使用 systemd 配置 MySQL 在启动后自动启动

安装 MySQL 后,检查服务的状态:

sudo systemctl status mysqld.service

输出应显示服务正在运行,但守护进程已禁用:

...

如果服务已启用,请禁用它。我们希望在进行更改之前先探索禁用的行为:

sudo systemctl disable mysqld.service

接下来,运行此命令检查 MySQL 是否被 multi-user.target 所需:

sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql

不会返回任何内容。现在检查符号链接是否存在:

sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

会出现一个消息,指出符号链接文件不存在:

...

现在,如果愿意,重新启动服务器并检查 MySQL 服务。它应该在运行。

无论您是否重新启动,现在重新启用 MySQL 服务:

sudo systemctl enable mysqld.service

这次,系统将在 /etc/systemd/system/multi-user.target.wants/ 下创建一个符号链接:

...

再次运行 ls 命令以确认:

sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

您将收到如下输出:

...

启用或禁用 systemd 服务会在默认目标的 wants 目录中创建或删除符号链接。

如果愿意,再次重启 Droplet,当它重新上线时运行 ps -ef 命令来检查服务状态。

ps -ef | grep mysql

此命令将提供有关 MySQL 是否正在运行的信息:

...

现在,您已经配置了 MySQL 在重启后重新启动。接下来,您将考虑崩溃情况。

使用 systemd 配置 MySQL 在崩溃后自动启动

作为一款现代应用程序,MySQL 已经配置为在崩溃后自动启动。让我们看看如何禁用它。

在编辑器中打开 MySQL 服务单元文件:

sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

在头部信息之后,文件的内容如下:

...

如您所见,Restart 参数的值被设置为 on-failure。这意味着 MySQL 服务将在不干净的退出代码或超时时重新启动。

systemd 服务的 man 页面显示了 Restart 参数的以下表格:

重启设置/退出原因 no always on-success on-failure on-abnormal on-abort on-watchdog
清洁的退出代码或信号 X X
不干净的退出代码 X X
不干净的信号 X X X X
超时 X X X
看门狗 X X X X

在 systemd 服务单元文件中,两个参数 - RestartRestartSec - 控制崩溃行为。第一个参数指定服务何时应重新启动,第二个参数定义了它在重新启动之前应等待多长时间。

为了测试崩溃行为,使用 kill -9 信号停止 MySQL 进程。在我们的情况下,主 PID 是 851;请用您自己的 PID 替换它:

ps -ef | grep mysql
sudo kill -9 851

等待几秒,然后检查状态:

sudo systemctl status mysqld.service

输出将显示 MySQL 已使用新的 PID 重新启动(在我们的情况下,新的进程 ID 是 1513):

...

接下来,重新打开单元文件:

sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

注释掉 MySQL 守护进程单元文件中的 Restart 指令并保存。这将禁用重新启动行为:

...

之后,重新加载 systemd 守护进程,然后重新启动 mysqld 服务:

sudo systemctl daemon-reload
sudo systemctl restart mysqld.service

您可以通过运行此命令找到服务的主 PID:

sudo systemctl status mysqld.service
...
Main PID: 1895 (mysqld)

使用 kill -9 命令,在您的环境中杀死 MySQL PID 的主 PID(我们在测试环境中使用 PID)。

sudo kill -9 1895

检查 MySQL 的状态:

sudo systemctl status mysqld.service

它将显示服务已失败:

...

尝试多次查找服务状态。每次服务都将显示为 failed

因此,我们模拟了服务停止并未重新启动的崩溃情况。这是因为我们已经告诉 systemd 在不干净的停止后不要重新启动服务。如果您编辑 mysqld.service 单元文件以取消注释 Restart 参数,保存它,重新加载 systemctl 守护进程,最后重新启动服务,那将恢复正常功能。

这就是您如何配置本机 systemd 服务在崩溃后自动启动。您只需在服务单元文件的 [Service] 部分下添加额外的 Restart 指令(和可选的 RestartSec)。

结论

在这个两部分系列中,你学习了 Linux 生态系统中使用的服务管理守护程序。然后,你探索了 systemd 的基础知识,并将这些基础知识应用到了一个实际的例子中:配置数据库在重启或崩溃后重新启动。如果你希望了解更多关于 systemd 的知识,请考虑阅读我们关于使用 systemctl 的全面教程。

最近更新

  1. TCP协议是安全的吗?

    2024-04-15 06:00:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-15 06:00:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-15 06:00:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-15 06:00:03       18 阅读

热门阅读

  1. 深度学习开源标注工具

    2024-04-15 06:00:03       16 阅读
  2. 目标检测与图像分类的区别(概念)

    2024-04-15 06:00:03       16 阅读
  3. 单调栈和单调队列所学的一些问题

    2024-04-15 06:00:03       24 阅读
  4. 长短期记忆网络 – Long short-term memory | LSTM

    2024-04-15 06:00:03       15 阅读
  5. 【Python】精通 SQLAlchemy:执行原生 SQL 语句的艺术

    2024-04-15 06:00:03       52 阅读
  6. 更全面使用SQLMap进行渗透测试

    2024-04-15 06:00:03       16 阅读
  7. Spring Boot 经典面试题(七)

    2024-04-15 06:00:03       19 阅读
  8. 项目一:认识python爬虫技术(小白入门级)

    2024-04-15 06:00:03       12 阅读
  9. Apache软件基金会的孵化标准和毕业标准

    2024-04-15 06:00:03       11 阅读
  10. Hive进阶Day05

    2024-04-15 06:00:03       10 阅读