【问题标题】:Restrict restarting systemd service with timer assigned使用分配的计时器限制重新启动 systemd 服务
【发布时间】:2020-11-16 13:13:40
【问题描述】:

我有一个分配了OnCalendar 计时器的systemd 服务单元。该服务调用运行代码的 JVM,该代码只能在特定的时间表上启动。

这个 systemd 单元(和其他几个单元)由 ansible playbook 管理,它使用 openstack/ansible-role-systemd_service 角色。每次我对其单元文件进行一些更改时,它都会重新启动 systemd 服务。

此外,还有一个处理程序,每次 Gitlab CI 管道运行此 ansible playbook 并将新的 .jar 工件上传到服务器时,它都会重新启动所有服务。

是否有任何 systemd 内置机制来限制重新启动服务并为其分配计时器? 不过,我必须能够在需要时手动停止/启动这些服务。

似乎我可以分叉该 ansible 角色并添加一些检查,但我想知道是否有一些本机和更直接的方法来实现这一点。

【问题讨论】:

  • 我不确定这是否是您想要的,但您可以将 RefuseManualStart=yes RefuseManualStop=yes 放入计时器和服务单元中。
  • 感谢您的建议,但我希望能够在需要时手动启动/停止服务。

标签: java ansible continuous-integration systemd


【解决方案1】:

看来我已经找到方法了:

创建不启用.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 重新启动服务,或者停止服务而不用systemd 标记它failed。这是因为JVM在主进程收到SIGTERM并优雅停止时返回143退出代码。

RemainAfterExit = False  

.timer 需要了解 .service 已停止。无论哪种方式,.timer 都会挂在running 状态,并且下次不会运行服务。

StandardOutput = null
StandardError = syslog

需要停止主进程将其 INFO 日志写入 syslog,并且只写入 ERROR。

[̶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 被使用。

所有这些更改似乎都成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2017-08-11
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2015-10-03
    相关资源
    最近更新 更多