/etc/systemd/系统/

/etc/systemd/系统/

我想区分由 systemd 计时器运行的 systemd 单元和使用 systemctl 手动调用的 systemd 单元。即检查备份是否按计划作为定期作业触发或“按需”完成。

我目前发现的情况:

  • 在计时器单元中没有地方设置环境变量?)
  • 传递给单元的环境是相同的,无论是由计时器触发还是手动触发

通过 systemd 运行定期和手动调用似乎比在 MOTD 中注明“对于计划操作使用 systemd 计时器,对于手动作业使用 /usr/local/bin 中的脚本”更方便;)

您有什么想法吗(除了单元实例化和复制具有不同环境的单元以供手动使用之外)?

答案1

但这里有一种将参数从计时器传递到单元的简单方法,那就是使用模板

例子

@创建一个以i 为名称的服务

/etc/systemd/系统/[电子邮件保护]

   [Unit]

   Description=test
   
   [Service]
   ExecStart=/bin/echo 'hello from %i'

那么你的计时器可以像

/etc/systemd/system/me.timer

[Unit]
Description=timer for me

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s
[email protected]

[Install]
WantedBy=multi-user.target

你看,现在你在后面传递的任何内容都@将成为%i你的服务文件中的内容。所以现在你只需要

[~] sudo systemctl daemon-reload 
[~] sudo systemctl start me.timer
[~] sudo systemctl status [email protected][email protected] - test
   Loaded: loaded (/etc/systemd/system/[email protected]; static; vendor preset: enabled)
   Active: active (running) since Thu 2018-02-08 19:35:38 PST; 7ms ago
 Main PID: 8899 (echo)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/system-me.slice/[email protected]

Feb 08 19:35:38 algx systemd[1]: Started test.
Feb 08 19:35:38 algx echo[8899]: hello from timer

如果你想从命令行启动该单元,只需在@

[~] sudo systemctl start me@cli
[~] sudo systemctl status [email protected]
✘  ~  sudo systemctl status [email protected][email protected] - test
   Loaded: loaded (/etc/systemd/system/[email protected]; static; vendor preset: enabled)
   Active: inactive (dead)

Feb 08 19:32:48 algx systemd[1]: Started test.
Feb 08 19:32:48 algx echo[8490]: hello from cli

这样,您就可以清楚地区分什么是计时器,什么是 cli,但您可以将其扩展到任何类型的触发器...您不需要维护 2 个单元文件,但您可以有一个明确的分离,因为从 systemd 的角度来看,这是 2 个不同的服务。

相关内容