详解如何实现Linux服务Crash后自动重启

 更新时间:2023年08月02日 16:49:28   作者:东风微鸣技术博客  
近期碰到了一个 Linux Systemd 服务 Crash, Crash 后需要人工介入重启. 那么, 有没有办法如何实现 Linux 服务 Crash 后自动重启,下面就来和大家分享一下

Systemd

Systemd Restart

Systemd 允许你对服务进行配置,以便在服务崩溃时自动重启。

一个典型的单元文件是这样的:

[Unit]
Description=Tailscale node agent
After=network-online.target
Wants=tailscale-weekly-update.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/tailscale update -yes

[Install]
WantedBy=multi-user.target

在上面的例子中,如果守护进程崩溃或被杀死,systemd 不会去管它。

不过,你可以让 systemd 自动重启守护进程,以防它崩溃或意外被杀掉。为此,你可以在 [Service] 中添加 Restart 选项。典型的示例如下:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target

StartLimitIntervalSec=600
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
    server \

上述操作会对任何导致守护进程停止的情况做出反应...只要守护进程停止,systemd 就会在 5 秒内重启它。

Restart 有 2 个可选参数:

  • always
  • on-failure: 即故障时重启. 涵盖了最广泛的故障情形,如信号不清和退出代码不清:

在本例中,[Unit] 部分还有 StartLimitIntervalSec 和 StartLimitBurst 指令。这可以防止故障服务每 5 秒钟重启一次。如果仍然失败,systemd 将停止尝试启动服务。

如果服务在 600 秒内 5 次尝试重启均未成功,则应进入失败状态,不再尝试重启。这样就能确保如果服务真的坏了,systemd 不会继续尝试重启它。应该人工上去处理了。

如果在守护进程被杀死后询问其状态,systemd 会显示正在activating (auto-restart)。

Systemd OnFailure

重启一项服务固然很好,但在某个单元出现故障时采取特定行动就更好了。也许你使用的软件有一个已知的错误,要求在崩溃时删除缓存文件,也许你想启动一个脚本来收集日志和系统信息,以便诊断问题。Systemd 允许你指定在服务失败时运行的单元。

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target

StartLimitIntervalSec=600
StartLimitBurst=5
OnFailure=k3s-recovery.service

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
    server \

此示例指定 OnFailure=k3s-recovery.service 来告诉 systemd,如果我的服务失败,它就应该启动 k3s-recovery 单元.

k3s-recovery 单元只是一个运行此脚本的一次性服务单元:

[Unit]
Description=K3s recovery

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/k3s-recovery.sh

这个脚本可以做任何事情:执行一些手动变通方法让服务重新运行,向监控系统发出警报,或者压缩一些临时日志和应用程序状态以排除故障。示例如下:

#!/bin/bash

echo 'Attempting to recover!' > /tmp/recovery_info
systemctl stop k3s.service
/usr/local/sbin/k3s-killall.sh
systemctl start k3s.service
Systemd FailureAction reboot

还有一种可能, 重启治百病! 所以 systemd 内置了在单元故障时触发系统重启的功能。在本例中,当单元发生故障时,系统将优雅地重新启动:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target

StartLimitIntervalSec=600
StartLimitBurst=5
FailureAction=reboot

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
    server \

FailureAction 有多种有效值: none, reboot, reboot-force, reboot-immediate, poweroff, poweroff-force, poweroff-immediate, exit, exit-force, soft-reboot, soft-reboot-force, kexec, kexec-force, halt, halt-force 和 halt-immediate.

总结

本文介绍了服务异常时, 自动处理故障的一些方式。Systemd 包含强大的功能,可自动响应以保持服务运行。

到此这篇关于详解如何实现Linux服务Crash后自动重启的文章就介绍到这了,更多相关Linux Crash后自动重启内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用 bind 设置 DNS 服务器的方法

    使用 bind 设置 DNS 服务器的方法

    Bind9是一个强大的Linux下开放源代码的DNS服务器软件,这篇文章主要介绍了使用 bind 设置 DNS 服务器的方法,需要的朋友可以参考下
    2020-03-03
  • CentOS 7下配置ntp服务的方法教程

    CentOS 7下配置ntp服务的方法教程

    网络时间协议(NTP)用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。这篇文章主要给大家介绍了在CentOS 7下配置ntp服务并开启开机自动启动的方法教程,需要的朋友可以参考下。
    2017-05-05
  • LINUX服务器安装SVN服务实现方式

    LINUX服务器安装SVN服务实现方式

    本文介绍了如何使用yum安装Subversion,创建版本库,配置SVN服务,并解决常见问题,详细步骤包括安装Subversion,查看安装版本和位置,创建存放版本库的目录及svn版本库,配置权限控制,启动svn版本库,以及处理端口访问权限等
    2024-09-09
  • LINUX磁盘分区、格式化、挂载、卸载详细过程

    LINUX磁盘分区、格式化、挂载、卸载详细过程

    这篇文章主要介绍了LINUX磁盘分区、格式化、挂载、卸载详细过程,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • 详解在Linux中搭建一个FTP服务器

    详解在Linux中搭建一个FTP服务器

    本篇文章主要介绍了在Linux中搭建一个FTP服务器 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • LINUX查看端口是否被占用过程解析

    LINUX查看端口是否被占用过程解析

    这篇文章主要介绍了LINUX查看端口是否被占用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Apache服务器中.htaccess文件的实用配置示例集锦

    Apache服务器中.htaccess文件的实用配置示例集锦

    这篇文章主要介绍了Apache服务器中.htaccess文件的实用配置示例集锦,囊括了防盗链重定向及强制浏览器下载指定的文件类型等例子,很黄很暴力,需要的朋友可以参考下
    2016-03-03
  • linux网络配置工具的使用

    linux网络配置工具的使用

    这篇文章主要介绍了linux网络配置工具的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Linux gcc命令的具体使用

    Linux gcc命令的具体使用

    这篇文章主要介绍了Linux gcc命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • CentOS7.2安装MySql5.7并开启远程连接授权的教程

    CentOS7.2安装MySql5.7并开启远程连接授权的教程

    这篇文章主要介绍了CentOS7.2安装MySql5.7并开启远程连接授权的教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07

最新评论