如何配置 Linux 服务使其在崩溃或重启后自动启动 - 第 2 部分:参考资料

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

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

这是两部分系列的第二半部分。 第一部分涵盖了一般的Linux服务管理概念,如init的戴蒙和运行级别。 它以systemd中的服务管理示范结束。

<$>[注] 注: 您也可以考虑阅读(我们非常流行的关于使用 `systemctl 来控制 systemd 服务和单元的教程)(https://andsky.com/tech/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units)。

前提条件

要完成本教程,您将需要:

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

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

1sudo systemctl status mysqld.service

输出应该显示该服务正在运行,但戴蒙已禁用:

 1[secondary_label Output]
 2 mysqld.service - MySQL 8.0 database server
 3   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
 4    Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago
 5   Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
 6   Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
 7   Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
 8 Main PID: 30378 (mysqld)
 9  Status: "Server is operational"
10   Tasks: 40 (limit: 4763)
11...

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

1sudo systemctl disable mysqld.service

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

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

现在检查是否有符号链接:

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

顯示一個訊息,表示 symlink 檔案不存在:

1[secondary_label Output]
2ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory

现在,如果你愿意,重新启动服务器并检查MySQL服务。

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

1sudo systemctl enable mysqld.service

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

1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

再次运行 ls 命令以确认此点:

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

你会得到这样的输出:

1[secondary_label Output]
2lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/mysqld.service -> /usr/lib/systemd/system/mysqld.service

启用或禁用 systemd 服务会从默认目标的欲望目录中创建或删除象征链接。

如果你喜欢,重新启动Droplet,当它回来时在线运行ps -ef命令来检查服务状态。

1ps -ef | grep mysql

此命令将提供有关MySQL的信息,如果它正在运行:

1[secondary_label Output]\
2mysql 851 1 2 04:26 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr

您现在已经配置了MySQL,以便在重新启动后重新启动。

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

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

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

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

在标题信息之后,文件的内容看起来如下:

 1[label /etc/systemd/system/multi-user.target.wants/mysqld.service]
 2
 3[Unit]
 4
 5Description=MySQL 8.0 database server
 6After=syslog.target
 7After=network.target
 8
 9[Service]
10
11Type=notify
12User=mysql
13Group=mysql
14
15ExecStartPre=/usr/libexec/mysql-check-socke
16ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
17`# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
18`# per bug #547485`
19ExecStart=/usr/libexec/mysqld --basedir=/usr
20ExecStartPost=/usr/libexec/mysql-check-upgrade
21ExecStopPost=/usr/libexec/mysql-wait-stop
22
23`# Give a reasonable amount of time for the server to start up/shut down`
24
25TimeoutSec=300
26
27`# Place temp files in a secure directory, not /tmp`
28
29PrivateTmp=true
30
31Restart=on-failure
32
33RestartPreventExitStatus=1
34
35`# Sets open_files_limit`
36
37LimitNOFILE = 10000
38
39`# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`
40
41Environment=MYSQLD_PARENT_PID=1
42
43[Install]
44
45WantedBy=multi-user.target

正如您所看到的,重启参数的值被设置为 On-Failure,这意味着MySQL服务会重新启动不清洁的输出代码或时空。

man page for systemd service显示下面的重启参数表:

QQ 重新启动设置/ 退出导致 QQ 总是 QQ 成功 QQ 失败 QX 异常 QQ 破坏 QQ 监视狗 QQ -?),又作"活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活 | 清洁出站代码或信号 \ X \ X \ \ \ \ \ \ \ \ \
{\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}你是谁? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}不伦瑞克的信号 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}时间过后 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我... {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}看门狗 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我..

在 systemd 服务单元文件中,两个参数,即重新启动重新启动Sec控制了崩溃行为,第一个参数指明服务何时重新启动,第二个参数指明该服务在重新启动之前应该等多久。

要测试崩溃行为,请用杀死 -9 信号阻止 MySQL 流程. 在我们的情况下,主要的 PID 是 851;用自己的 PID 替换:

ps -ef | grep mysql

1sudo kill -9 851

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

1sudo systemctl status mysqld.service

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

 1[secondary_label Output]
 2  mysqld.service - MySQL 8.0 database server
 3   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
 4   Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago
 5  Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
 6  Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
 7  Process: 1476 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)Process: 1451 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
 8 Main PID: 1513 (mysqld)
 9   Status: "Server is operational"
10...

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

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

评论 MySQL daemon 的单元文件中的重启指令,然后保存它。

1[label /etc/systemd/system/multi-user.target.wants/mysqld.service]
2
3`# Restart=on-failure`

之后,重新加载 systemd daemon,然后重新启动 mysqld 服务:

1sudo systemctl daemon-reload
2sudo systemctl restart mysqld.service

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

1sudo systemctl status mysqld.service
1[secondary_label Output]
2. . .
3Main PID: 1895 (mysqld)

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

1sudo kill -9 1895

查看 MySQL 的状态:

1sudo systemctl status mysqld.service

它会显示服务失败了:

 1[secondary_label Output]
 2mysqld.service - MySQL 8.0 database server
 3   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
 4   Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago
 5  Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
 6  Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
 7  Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL)
 8  Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS
 9  Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
10  Main PID: 1895 (code=**killed**, signal=KILL)
11   ...

尝试查找服务状态几次,每次服务将显示为失败

因此,我们模拟了服务停止并未返回的故障,这是因为我们已指示系统d在不清洁停止后不要重新启动服务. 如果您编辑 myqld.service 单元文件以免评论重启参数,保存它,重新加载 systemctl 戴蒙,并最终重新启动服务,这将恢复正常功能。

您只需在服务单元文件的[服务]部分中添加一个额外的重启指令(以及可选的重启Sec)。

结论

在这两部分的系列中,你了解了在Linux生态系统中使用的服务管理恶魔,然后探索了systemd的基本知识,并将这些基本知识应用到一个实用例子中:配置数据库在重新启动或崩溃后重新启动。

Published At
Categories with 技术
comments powered by Disqus