在分配了计时器的情况下限制重新启动systemd服务

wnrlj8wa  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(264)

我有一个系统服务单位 OnCalendar 分配给它的计时器。该服务调用运行代码的jvm,而jvm只能按照特定的时间表启动。
这个systemd单元(以及其他几个)由ansible playbook管理,它使用openstack/ansible-role-systemd\u服务角色。每次我对systemd服务的单位文件进行一些更改时,它都会重新启动systemd服务。
此外,还有一个处理程序,每当gitlab ci管道运行这个ansible playbook并上传一个新的脚本时,它都会重新启动所有服务 .jar 服务器的工件。
是否有任何systemd内置机制来限制重新启动服务并为其分配计时器?不过,我必须能够在需要时手动停止/启动这些服务。
似乎我可以分叉的ansible角色,并添加一些检查,但我想知道一些本地和更直接的方式来实现这一点。

mcdcgff0

mcdcgff01#

看来我找到了方法:
创建和不启用 .service 单位,包含下一个:

[Unit]
After = network-online.target
...

[Service]
Type = simple
...
SuccessExitStatus = 143
RestartForceExitStatus = 143
Restart = on-failure
RemainAfterExit = False
StandardOutput = null
StandardError = syslog

[̶I̶n̶s̶t̶a̶l̶l̶]
W̶a̶n̶t̶e̶d̶B̶y̶ ̶=̶ ̶m̶u̶l̶t̶i̶-̶u̶s̶e̶r̶.̶t̶a̶r̶g̶e̶t̶

创建并启用 .timer 单位,包含下一个:

[Timer]
O̶n̶B̶o̶o̶t̶S̶e̶c̶ ̶=̶ ̶0̶m̶i̶n̶
OnCalendar = *-*-* 18:00:00
Persistent = yes

[Install]
WantedBy=multi-user.target

一点解释:

After = network-online.target

需要确保服务只有在上线后才能启动。

Restart = on-failure
SuccessExitStatus = 143
RestartForceExitStatus = 143

需要能够 kill 主进程,并使systemd重新启动服务,或停止服务w/o systemd标记它 failed . 这是因为当主进程收到 SIGTERM 然后优雅地停下来。

RemainAfterExit = False

需要 .timer 为了理解这一点 .service 停止了。不管怎样, .timer 会挂在墙上 running 状态,下次不会运行服务。

StandardOutput = null
StandardError = syslog

需要停止主进程将其信息日志写入syslog,并且只在其中写入错误。

[̶I̶n̶s̶t̶a̶l̶l̶]
W̶a̶n̶t̶e̶d̶B̶y̶ ̶=̶ ̶m̶u̶l̶t̶i̶-̶u̶s̶e̶r̶.̶t̶a̶r̶g̶e̶t̶

因为必须禁用服务而忽略。不管怎样,它都会在系统启动时启动。

Persistent = yes

如果错过了目标时间,则需要能够在系统引导后的当天晚些时候启动服务。

O̶n̶B̶o̶o̶t̶S̶e̶c̶ ̶=̶ ̶0̶m̶i̶n̶

遗漏原因 OnCalendar 使用了。
所有这些变化似乎都起到了作用。

相关问题