我希望能够从 systemd 检索上次激活服务oneshot
花费了多长时间。我考虑了以下选项,但它们并没有完全说服我:
计算
InactiveEnterTimestamp - InactiveExitTimestamp
,例如通过 Python 中的 D-Bus 接口读取它们。这样做的缺点是在服务运行时不一致(=负)。使用
ExecStartPre
和中的帮助程序脚本ExecStartPost
来存储时间戳并计算服务退出后的经过时间。在服务可执行文件周围使用包装脚本,一旦主可执行文件退出,该脚本就会将经过的时间存储在文件系统的某个位置。
使用帮助程序脚本来
ExecStartPost
存储#1 中计算的值。
如果可能的话,我的偏好是#4,如果不是的话,我的偏好是#3。你有什么建议?有更好的方法吗?
背景:我在跑步微小的 RSS,其中有一个提要更新程序脚本,我使用 systemd 计时器定期运行该脚本。我也跑同步以同样的方式备份 Gmail 收件箱的内容。我的最终目标是能够监视每个服务激活花费的时间,并在花费太长时间或长时间未运行时发出警报。
编辑:我的服务文件如下所示:
[Unit]
Description=Tiny Tiny RSS feeds update
After=network.target mysqld.service postgresql.service
[Service]
Type=oneshot
ExecStart=/usr/bin/php /usr/share/webapps/tt-rss/update.php --feeds
User=ttrss
StandardOutput=syslog
StandardError=syslog
这是计时器:
[Unit]
Description=Tiny Tiny RSS feeds update timer
[Timer]
OnBootSec=1s
OnUnitInactiveSec=120s
Persistent=true
Unit=tt-rss.service
[Install]
WantedBy=timers.target
答案1
计算 InactiveEnterTimestamp - InactiveExitTimestamp
激活时间(以秒为单位)由以下因素计算得出:
(ActiveEnterTimestampMonotonic - InactiveExitTimestampMonotonic) / 1e6
analyze_plot
查看文件中的函数分析.c了解详情。
但你应该有RemainAfterExit=yes
在你的单位得到ActiveEnterTimestampMonotonic
。
ExecMainExitTimestampMonotonic - ExecMainStartTimestampMonotonic
你可以在PostStartExec
没有的情况下计算RemainAfterExit
。
例如,通过 Python 中的 D-Bus 接口读取它们。
您可以使用systemctl
以下方法提取这些值:
$ systemctl show -p InactiveExitTimestampMonotonic -p ActiveEnterTimestampMonotonic unit
InactiveExitTimestampMonotonic=44364325621
ActiveEnterTimestampMonotonic=44369331083
根据接口稳定性承诺:
The stable interfaces are:
...
The command line interface of systemctl, loginctl, journalctl.
We will make sure that scripts invoking these commands will continue
to work with future versions of systemd. Note however that the output
generated by these commands is generally not included in the promise,
unless it is documented in the man page. Example: the output of
"systemctl status" is not stable, but the one of "systemctl show" is,
because the former is intended to be human readable and the latter
computer readable, and this is documented in the man page.
我的最终目标是能够监控每个服务激活花费的时间,并在花费时间太长时发出警报
TimeoutStartSec=
Configures the time to wait for start-up. If a daemon service does
not signal start-up completion within the configured time, the
service will be considered failed and will be shut down again.
OnFailure=
A space-separated list of one or more units that are activated when
this unit enters the "failed" state.
或者很久没有跑步
您可以从日志中提取上次成功时间:
journalctl -u your-service MESSAGE='Started your-service.service.'
但你应该使能够日志消息的持久存储。