当前位置:首页 » 《关于电脑》 » 正文

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

25 人参与  2024年04月18日 10:58  分类 : 《关于电脑》  评论

点击全文阅读


作者选择了自由开源基金会作为 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 参数的以下表格:

重启设置/退出原因noalwayson-successon-failureon-abnormalon-aborton-watchdog
清洁的退出代码或信号XX
不干净的退出代码XX
不干净的信号XXXX
超时XXX
看门狗XXXX

在 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-reloadsudo 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 的全面教程。


点击全文阅读


本文链接:http://zhangshiyu.com/post/96963.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1