AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1079993
Accepted
Paul
Paul
Asked: 2021-10-09 06:46:54 +0800 CST2021-10-09 06:46:54 +0800 CST 2021-10-09 06:46:54 +0800 CST

为什么我的 systemd 计时器仅在单位为目标时触发一次?

  • 772

我有几个服务(静态站点生成器),我想从同一个 systemd 计时器定期触发。我找到了这个问题/答案,它完全涵盖了我想要做的事情,并描述了一个设置,其中多个服务的.target文件Wants=由相应的计时器触发。这听起来不错,但我发现当我实际设置它时,它只会触发一次,然后自行禁用!

我准备了一个最小的工作示例(这不会触发多个服务,但演示了相同的问题):

test-timer.timer:

[Unit]
Description=A test timer

[Timer]
OnCalendar=*-*-* *:*:30
Unit=test-timer.target

[Install]
WantedBy=timers.target

test-timer.target:

[Unit]
Description=Target unit
Wants=test-timer.service
After=test-timer.service

[Install]
WantedBy=timers.target

test-timer.service:

[Unit]
Description=Run test

[Service]
ExecStart=/usr/bin/bash -c "date --rfc-3339='seconds' >> /tmp/test-timer-output"

[Install]
Also=test-timer.target

启用计时器:

$ sudo cp test-timer.* /etc/systemd/system/
$ sudo systemctl enable --now test-timer.timer
Created symlink /etc/systemd/system/timers.target.wants/test-timer.timer → /etc/systemd/system/test-timer.timer.

然后,当我查看 的输出时systemctl list-timers --all,在第一次运行之前我得到(忽略其他计时器):

NEXT                        LEFT       LAST     PASSED       UNIT                ACTIVATES
Fri 2021-10-08 10:38:30 EDT 21s left   n/a      n/a          test-timer.timer    test-timer.target

第一次运行后,NEXT已LEFT替换为n/a:

NEXT     LEFT    LAST                        PASSED        UNIT                  ACTIVATES
n/a      n/a     Fri 2021-10-08 10:38:32 EDT 1min 5s ago   test-timer.timer      test-timer.target

我也尝试过添加Persistent=true和test-timer.target明确启用test-timer.target,但这些都不起作用。任何时候我这样做systemctl restart test-timer.timer,它都会重新启动,但只会触发一次运行,然后再也不会运行。

Unit=如果我通过更改 to 的行test-timer.timer来移除间接层Unit=test-timer.service,该服务会像预期的那样每分钟愉快地触发自己。

我是否缺少一些配置或安装步骤?

systemd systemd-timers
  • 1 1 个回答
  • 788 Views

1 个回答

  • Voted
  1. Best Answer
    Paul
    2021-10-12T09:52:20+08:002021-10-12T09:52:20+08:00

    在 Twitter 上获得一些帮助后,我设法解决了这个问题。问题是 systemd计时器只会激活不活动的服务,并且目标的默认行为是激活并保持活动状态,除非有什么东西使它停止运行(它与它的单元的生命周期无关Wants=)。如果它激活的任何服务变为非活动状态,要强制目标单元变为非活动状态,请在上面的示例中使用BindsTo=代替。Wants=所以,对于这个最小的例子:

    test-timer.target:

    [Unit]
    Description=Target unit
    BindsTo=test-timer.service
    After=test-timer.service
    
    [Install]
    WantedBy=timers.target
    

    test-timer.service:

    [Unit]
    Description=Run test
    
    [Service]
    ExecStart=/usr/bin/bash -c "date --rfc-3339='seconds' >> /tmp/test-timer-output"
    
    [Install]
    Also=test-timer.target
    

    然后您可以看到,一旦test-timer.service完成运行,test-timer.target也将变为inactive(因此计时器将能够再次激活它):

    $ sudo systemctl list-units --all test-timer.target test-timer.service
      UNIT               LOAD   ACTIVE   SUB  DESCRIPTION
      test-timer.service loaded inactive dead Run test   
      test-timer.target  loaded inactive dead Target unit
    

    而在更改之前,目标在服务终止后保持活动状态:

    $ sudo systemctl list-units --all test-timer.target test-timer.service
      UNIT               LOAD   ACTIVE   SUB    DESCRIPTION
      test-timer.service loaded inactive dead   Run test   
      test-timer.target  loaded active   active Target unit
    
    • 5

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve