AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 422933
Accepted
Matt K
Matt K
Asked: 2018-02-09 15:50:45 +0800 CST2018-02-09 15:50:45 +0800 CST 2018-02-09 15:50:45 +0800 CST

混淆 systemd 行为与 OnFailure= 和 Restart=

  • 772

我在嵌入式系统中使用 systemd 231,我正在尝试创建一个服务来监视系统中的硬件组件。这是对我正在尝试做的事情的粗略描述:

  1. 当服务 ,foo.service启动时,它会启动一个应用程序 , foo_app。
  2. foo_app监控硬件组件,持续运行。
  3. 如果foo_app检测到硬件故障,它会以返回码 1 退出。这应该会触发系统重新启动。
  4. 如果foo_app崩溃,systemd 应该重新启动foo_app。
  5. 如果foo_app 反复崩溃,systemd 应该重新启动系统。

这是我将其作为服务实现的尝试:

[Unit]
Description=Foo Hardware Monitor

# If the application fails 3 times in 30 seconds, something has gone wrong,
# and the state of the hardware can't be guaranteed. Reboot the system here.
StartLimitBurst=3
StartLimitIntervalSec=30
StartLimitAction=reboot

# StartLimitAction=reboot will reboot the box if the app fails repeatedly,
# but if the app exits voluntarily, the reboot should trigger immediately
OnFailure=systemd-reboot.service

[Service]
ExecStart=/usr/bin/foo_app

# If the app fails from an abnormal condition (e.g. crash), try to
# restart it (within the limits of StartLimit*).
Restart=on-abnormal

从文档(s​​ystemd.service和systemd.service)来看,我希望如果我以一种触发foo_app的方式杀死(例如), systemd 应该优先考虑over而不是 start 。Restart=on-abnormalkillall -9 foo_appRestart=on-abnormalOnFailure=systemd-reboot.servicesystemd-reboot.service

然而,这不是我所看到的。只要我杀foo_app了一次,系统就会立即重新启动。

以下是文档中的一些相关片段:

OnFailure=

当该单元进入“失败”状态时激活的一个或多个单元的空格分隔列表。只有在达到启动限制后,使用 Restart= 的服务单元才会进入失败状态。

Restart=

[snip]请注意,服务重启受限于使用 StartLimitIntervalSec= 和 StartLimitBurst= 配置的单元启动速率限制,有关详细信息,请参阅 systemd.unit(5)。只有在达到启动限制后,重新启动的服务才会进入失败状态。

文档看起来很清楚:

  • 中指定的服务OnFailure应仅在服务进入“ failed”状态时运行
  • 一个服务只有在满意后才应该进入“ failed”状态。StartLimitIntervalSecStartLimitBurst

这不是我所看到的。

为了确认这一点,我将我的服务文件编辑为以下内容:

[Unit]
Description=Foo Hardware Monitor  
  
StartLimitBurst=3
StartLimitIntervalSec=30
StartLimitAction=none

[Service]
ExecStart=/usr/bin/foo_app
Restart=on-abnormal

通过删除OnFailure和设置StartLimitAction=none,我能够看到 systemd 如何应对foo_app死亡。这是一个我反复杀死的foo_app测试SIGKILL。

[root@device ~]
# systemctl start foo.service
[root@device ~]
# journalctl -f -o cat -u foo.service &
[1] 2107
Started Foo Hardware Monitor.
[root@device ~]
# killall -9 foo_app
foo.service: Main process exited, code=killed, status=9/KILL
foo.service: Unit entered failed state.
foo.service: Failed with result 'signal'
foo.service: Service hold-off time over, scheduling restart.
Stopped foo.
Started foo.

[root@device ~]
# killall -9 foo_app
foo.service: Main process exited, code=killed, status=9/KILL
foo.service: Unit entered failed state.
foo.service: Failed with result 'signal'
foo.service: Service hold-off time over, scheduling restart.
Stopped foo.
Started foo.

[root@device ~]
# killall -9 foo_app
foo.service: Main process exited, code=killed, status=9/KILL
foo.service: Unit entered failed state.
foo.service: Failed with result 'signal'
foo.service: Service hold-off time over, scheduling restart.
Stopped foo.
foo.service: Start request repeated too quickly
Failed to start foo.
foo.service: Unit entered failed state.
foo.service: Failed with result 'start-limit-hit'

这是有道理的或大部分。当foo_app被杀死时,systemd 会重新启动它,直到StartLimitBurst被击中然后放弃。这就是我想要的,除了StartLimitAction=reboot.

不寻常的是,systemd 会在被杀死foo.service: Unit entered failed state.时打印foo_app,即使它即将通过Restart=on-abnormal. 这似乎与上面引用的文档中的这些行直接矛盾:

只有在达到启动限制后,使用 Restart= 的服务单元才会进入失败状态。

只有在达到启动限制后,重新启动的服务才会进入失败状态。

这一切都让我很困惑。我是否误解了这些系统选项中的任何一个?这是系统错误吗?任何帮助表示赞赏。

systemd services
  • 1 1 个回答
  • 12881 Views

1 个回答

  • Voted
  1. Best Answer
    cunninghamp3
    2018-03-29T12:23:22+08:002018-03-29T12:23:22+08:00

    编辑 2019/08/12: Pertherealjumbo的评论,对此的修复已与systemdv239 合并并发布,因此,如果您由于您的发行版(看着您的 CentOS)而没有被固定到某个版本,那就开心吧!

    TL;DR - 已知的文档问题,目前仍是该systemd项目的未决问题

    事实证明,自从您提出这个问题以来,这已被报告并确定为systemd文档与实际行为之间的差异。根据我的理解(以及我对 github 问题的阅读),您的期望和文档匹配,所以您并不疯狂。

    当前systemd在每次尝试启动后将状态设置为失败,无论是否已达到启动限制。在这个问题中,OP 写了一个关于学习骑自行车的有趣轶事,我强烈建议您看看。

    • 10

相关问题

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 来自 `service | 的意外结果 grep`

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve