问题描述
我正在编写一个小的故障处理程序,用于当一个单元的应用程序无法启动时。这个想法是,如果应用程序失败,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
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)