Systemd %n 单位名称问题

问题描述

我正在编写一个小的故障处理程序,用于当一个单元的应用程序无法启动时。这个想法是,如果应用程序失败,OnFailture 例程将启动一个失败处理单元,该单元将启动一个以单元名称作为命令行参数的 python。这是在嵌入式系统中,因此稳定性至关重要。我正在为操作系统使用 yocto 和 bitbake。

被设计为失败的演示单元:

[Unit]
Description=Unit description
After=SomeUnit.service
Wants=SomeUnit.service
OnFailure=FailHandler@%n.service

[Service]
#Environment=
ExecStart= /pathToApp
Restart=on-failure
RestartSec=10
Type=simple


[Install]
WantedBy=some.target

故障处理单元:

[Unit]
Description=Fail handler for when one of the applications fails to start properly

[Service]
#Environment=
ExecStart=/usr/bin/python3 /opt/rapp/bin/fail_handler.py %i
Type=oneshot

Python 应用程序:

import logging
import logging.handlers
import syslog
import sys

syslog.openlog(ident="FailureHandler",facility=syslog.LOG_ERR)
syslog.openlog(ident="FailureHandler",facility=syslog.LOG_DEBUG)

log = syslog.syslog


def argumentParser():
    log(syslog.LOG_DEBUG,'Parsing args')
    try:
        argumentNum=len(sys.argv)
        if argumentNum > 2:
            log(syslog.LOG_ERR,"Too many arguments")
        arguments=sys.argv
        return arguments[1]
    except:
        log(syslog.LOG_ERR,'Failed to parse arguments')

def main():
    log(syslog.LOG_DEBUG,"On Failture application started")
    mainArg=argumentParser()
    log(syslog.LOG_CRIT,"Application: %s has Failed multiple times" % (mainArg))


if __name__ == "__main__":
    main()

问题表现如下:

如果我启动具有 OnFailure 选项并设计为直接从命令行失败的 systemd 单元,则永远不会调用 FailureHandler。但是,如果它是从目标启动的,则它是必需的并且失败,则调用 FailureHandler 但它记录的内容是目标的名称。 如下图所示:

2021-02-26T14:02:03.201748+00:00 OS FailureHandler: Application: targetname has Failed multiple times

根据我的理解,%n 应该为 FailueHandler 单元提供启动它的单元的名称。似乎它不是那样运作的,所以我很困惑。我正在使用这些链接了解如何:

https://www.freedesktop.org/software/systemd/man/systemd.unit.html https://www.worthe-it.co.za/blog/2017-11-07-error-reporting-from-your-systemd-automation.html

这是我对 systemd 的错误理解还是操作系统的错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)