systemd:实现 Linux 服务 Crash 后自动重启systemd:

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

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

[Unit]Description=Tailscale node agentAfter=network-online.targetWants=tailscale-weekly-update.timer
[Service]Type=oneshotExecStart=/usr/bin/tailscale update -yes
[Install]WantedBy=multi-user.target

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

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

[Unit]Description=Lightweight KubernetesDocumentation=https://k3s.ioWants=network-online.targetAfter=network-online.target
StartLimitIntervalSec=600StartLimitBurst=5
[Install]WantedBy=multi-user.target
[Service]Type=notifyEnvironmentFile=-/etc/systemd/system/k3s.service.envKillMode=processDelegate=yesLimitNOFILE=1048576LimitNPROC=infinityLimitCORE=infinityTasksMax=infinityTimeoutStartSec=0Restart=alwaysRestartSec=5sExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'ExecStartPre=-/sbin/modprobe br_netfilterExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/k3s \ server \

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

Restart 有 2 个可选参数:

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

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

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

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

Systemd OnFailure

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

[Unit]Description=Lightweight KubernetesDocumentation=https://k3s.ioWants=network-online.targetAfter=network-online.target
StartLimitIntervalSec=600StartLimitBurst=5OnFailure=k3s-recovery.service
[Install]WantedBy=multi-user.target
[Service]Type=notifyEnvironmentFile=-/etc/systemd/system/k3s.service.envKillMode=processDelegate=yesLimitNOFILE=1048576LimitNPROC=infinityLimitCORE=infinityTasksMax=infinityTimeoutStartSec=0Restart=on-failureRestartSec=5sExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'ExecStartPre=-/sbin/modprobe br_netfilterExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/k3s \ server \

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

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

[Unit]Description=K3s recovery
[Service]Type=oneshotExecStart=/usr/local/sbin/k3s-recovery.sh

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

#!/bin/bash
echo 'Attempting to recover!' > /tmp/recovery_infosystemctl stop k3s.service/usr/local/sbin/k3s-killall.shsystemctl start k3s.service

Systemd FailureAction reboot

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

[Unit]Description=Lightweight KubernetesDocumentation=https://k3s.ioWants=network-online.targetAfter=network-online.target
StartLimitIntervalSec=600StartLimitBurst=5FailureAction=reboot
[Install]WantedBy=multi-user.target
[Service]Type=notifyEnvironmentFile=-/etc/systemd/system/k3s.service.envKillMode=processDelegate=yesLimitNOFILE=1048576LimitNPROC=infinityLimitCORE=infinityTasksMax=infinityTimeoutStartSec=0Restart=on-failureRestartSec=5sExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'ExecStartPre=-/sbin/modprobe br_netfilterExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/k3s \ server \

FailureAction 有多种有效值: nonerebootreboot-forcereboot-immediatepoweroffpoweroff-forcepoweroff-immediateexitexit-forcesoft-rebootsoft-reboot-forcekexeckexec-forcehalthalt-force 和 halt-immediate.

总结

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

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9525

(0)
郭靖的头像郭靖
上一篇 2023年8月14日 下午4:59
下一篇 2023年8月15日 下午4:50

相关推荐

  • cobbler搭建

    什么是cobbler Cobbler是一个Linux系统安装的服务,可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等。 Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用。 Cobbler是较早前的kickstart的升…

    2022年11月26日
    1.1K00
  • Linux中route add命令的语法及使用!

      在Linux操作系统中,有许多常用的命令,这些命令都有着非常重要的作用,而且掌握命令也是每一个Linux运维工程师的必备技能之一。接下来,这篇文章主要为大家讲解一下Linux中route add命令的语法及使用,一起来学习一下吧!   route add命令用于将路由添加到Linux系统的路由表中。它定义了将数据包从系统发送到特定目的地的路径。   语法…

    2024年6月26日
    1.6K00
  • OpenSSH_9.3p1 升级到 OpenSSH_9.5p1

    文章声明:此文基于实操撰写 生产环境:此文升级是基于9.3p1升级9.5p1ssh -V查看版本是:OpenSSH_9.3p1, OpenSSL 1.1.1t 7 Feb 2023问题关键字:OpenSSH 升级, OpenSSH 更新, OpenSSH 漏洞修复漏洞信息:OpenSSH 命令注入漏洞(CVE-2020-15778)、OpenSSH 安全漏洞…

    2023年12月13日
    1.3K00
  • Linux系统管理本地 Linux 用户和组

    Linux的用户UID 系统中的每个进程(运行程序)都作为一个特定用户运行。每个文件归一个特定用户所有。对文件和目录的访问受到用户的限制。与运行进程相关联的用户可确定该进程可访问的文件和目录。 用户的分类 root用户 用户系统中唯一,权限最大,可以操作任意命令 普通用户 权限较低,只能编辑自己的用户家目录,由root账户创建 虚拟用户 没有登录系统的权限,…

    2022年6月11日
    1.2K00
  • Linux系统下配置双网卡只能ping通一个解决方案

    解决办法:第一步:找到两块网卡名称,再执行关闭反向路由检查(命令中第二及第三项根据实际网卡名来替换) 第二步:配置完之后你会发现双IP都能ping通了,但如服务器重启后将会默认开启,所以还要执行下一步骤来防止每次开机自动关闭反向路由检查,将以上命令加入 /etc/rc.local 即可。 其他:如涉及到此文件权限可以给/etc/rc.local文件添加执行权…

    2023年5月5日
    1.9K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信