You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Systemd定时器的UNIX时间戳(Epoch)?

Systemd时间戳处理(Shell脚本场景)

问题1:是否可直接获取所有时间戳的Epoch格式?

可以直接获取大部分时间戳的Epoch格式,具体方法如下:

  • 使用systemctl show时,添加--time=unix参数,可将*Timestamp类字段直接输出为Unix时间戳(Epoch),示例命令:
    systemctl show mytimer.timer -p NextElapseUSecRealtimeTimestamp --time=unix
    
  • 对于systemctl list-timers输出的格式化时间,可借助systemd-analyze timestamp工具转换为Epoch,示例:
    systemd-analyze timestamp "2024-05-20 14:30:00" --unix
    

少数特殊时间戳字段若无法通过上述方法获取,可通过DBus接口直接查询systemd的原始时间数据。

问题2:*Timestamp与*TimestampMonotonic的转换公式是什么?

*Timestamp对应clock_gettime(2)的CLOCK_REALTIME(墙钟时间,即Epoch时间),*TimestampMonotonic对应CLOCK_MONOTONIC(系统启动后的单调时间,不受手动时间调整影响),转换核心是计算两者的偏移量:

步骤1:获取时间偏移量

先获取当前系统的墙钟Epoch时间和对应单调时间,计算偏移值(单位统一为微秒):

# 读取KernelTimestamp(Epoch秒数)和KernelTimestampMonotonic(单调时间微秒数)
read -r kernel_epoch kernel_monotonic <<< $(systemctl show -p KernelTimestamp -p KernelTimestampMonotonic --time=unix | awk -F'=' '{print $2}')
# 计算偏移量:offset = Epoch微秒数 - 单调时间微秒数
offset=$((kernel_epoch * 1000000 - kernel_monotonic))

步骤2:单调时间转Epoch时间

使用以下公式转换(单调时间单位为微秒):

目标Epoch时间(秒) = (单调时间微秒数 + offset) / 1000000

示例转换命令:

# 假设已知某TimestampMonotonic值为1620000000000微秒
monotonic_time=1620000000000
target_epoch=$(( (monotonic_time + offset) / 1000000 ))
echo $target_epoch

注意:系统时间若被手动调整(如NTP校准),偏移量会发生变化,建议每次转换前重新获取最新偏移值,避免计算误差。


内容的提问来源于stack exchange,提问作者Albert Camu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:22:49