由计时器触发的 Systemd 服务并不总是执行其程序

由计时器触发的 Systemd 服务并不总是执行其程序

我们有一台运行大量 cron 作业的服务器,我们希望将其转移到 systemd 计时器。在创建 .service 和 .timer 文件的过程中,我遇到了CentOS 上的这个错误(我们正在使用)。为了确保我们不会遇到同样的问题,我选择将 .service 文件指向一个简单的 Python 脚本,该脚本仅打印时间和环境变量的值。我让它运行了几天,我发现虽然计时器本身按时触发,但有时实际的服务不会运行。这是我的journalctl单元文件的结果:

Feb 03 15:52:28 li681-190 python3[12230]: Service "Business Script" ran at 2020-02-03 15:52:28.483885
Feb 03 15:52:28 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:53:46 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:53:46 li681-190 python3[12296]: Service "Business Script" ran at 2020-02-03 15:53:46.299353
Feb 03 15:53:46 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:55:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:55:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:56:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:56:01 li681-190 python3[12427]: Service "Business Script" ran at 2020-02-03 15:56:01.952895
Feb 03 15:56:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:57:02 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:57:02 li681-190 python3[12539]: Service "Business Script" ran at 2020-02-03 15:57:02.790428
Feb 03 15:57:02 li681-190 systemd[1]: Started business_script.py runner.

正如您所看到的,有时服务会运行测试脚本,有时则不会。我知道使用oneshotwithOnUnitActiveSec可能会出现问题,如此处所述systemd 问题 6680 评论,这很奇怪,因为它对我来说仍然运行得很好。顺便说一句,我有一些OnCalendar脚本在计时器触发时并不总是启动服务。为什么我的服务总是不运行?我们运行的是 CentOS 7-6.1810。

我的 .timer 文件如下所示:

[Unit]
Description=Run business-script.py script every minute.
Requires=business-script.service

[Timer]
Unit=business-script.service
OnBootSec=1min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

我的 .service 文件如下所示:

[Unit]
Description=timer_test.py runner
After=network.target

[Service]
User=business-script-user
Group=business-script-user
Type=oneshot

WorkingDirectory=/usr/local/bin/
ExecStart=/usr/bin/python3 timer-test.py
Environment='SERVICE_NAME="Business Script"'

[Install]
WantedBy=multi-user.target

我写的Python脚本如下:

import datetime
import os


def main():
    service_name = os.getenv('SERVICE_NAME')
    now = datetime.datetime.now()
    print('Service {} ran at {}'.format(service_name, now))


if __name__ == '__main__':
    main()

答案1

所以我决定检查整个系统journalctl,我发现脚本实际上确实触发了,但它没有登录到单元文件中。我想我原来的问题现在不正确,需要对不同的问题进行更多调查。

对于遇到此问题的任何人,请查看journalctl而不是journalctl -u your-unit.service.您的服务正在运行的证明可能就在那里。

相关内容