我看到一个匿名进程每 80 秒将我的系统时间更改为 UTC。使用该journalctl -f
命令,我只会看到一条消息,显示“systemd[1]:时间已更改”,但无法识别哪个进程正在执行此操作。
我知道任何更改系统时间的人都必须编辑 /etc/localtime 文件。有什么办法可以找到该进程并让它留下痕迹,以便我可以识别它是什么进程?
答案1
我想你想看一下auditd
。以下文档来自 Redhat,但也适用于 CentOS 7:
答案2
/etc/localtime
决定默认时区系统的。调整系统时间时无需更改此文件,除非您同时还更改系统默认时区。
该消息systemd[1]: time has been changed
意味着正在调整系统时钟。它可以是ntpd
,systemd-timesyncd
或者任何其他 NTP 客户端。
请注意,该date
命令将随日期和时间一起显示时区说明符。如果时区说明符发生变化,则表示有东西在操纵时区设置:如果系统时间更改时时区说明符没有变化,则表示系统时钟正在调整,时区设置保持不变。
如果 NTP 时间同步导致常规date
命令输出跳转到 UTC,则您的时区设置不正确。您可以使用timedatectl set-timezone
命令设置时区,也可以将相应的时区规范文件从 复制/usr/share/zoneinfo/
到/etc/localtime
。为了避免混淆配置工具,您还应该更改 中的值/etc/sysconfig/clock
以匹配新的默认系统时区 - 但请记住,这/etc/localtime
实际上是决定默认系统时区的主要因素。/etc/sysconfig/clock
只是为配置工具提供了一种简单的方法来找出当前设置。
一些背景信息:
任何 Unix 风格的系统的系统时钟都应始终在内部以 UTC 运行。所有时间戳值都应在输入时转换为 UTC,并在输出时返回用户首选的时区。NTP 时间同步也基本上只使用 UTC,因此它非常符合此 Unix 标准做法。
/etc/localtime
和/或TZ
环境变量仅确定所使用的转换。这样,每个用户,甚至每个单独的程序都可以使用不同的时区(通过在需要非默认时区时设置 TZ 环境变量),并且系统仍然可以具有统一的时间概念。
这种方案是在计算机还很稀有、庞大且昂贵的时候开发的,当时用户可能使用基于文本的调制解调器连接从多个时区访问一台中央计算机。
由于 Linux 有时必须与 Windows 在双启动系统中共存,因此 Linux 有一个单独的概念硬件时钟。这是一个小型的、通常由电池供电的设备,用于在系统关闭时维护系统时间。另一方面,系统时钟基于内核的计时算法(如果可用且没有已知的硬件错误,则可能基于处理器的时间戳计数器寄存器)。
硬件时钟可以设置为本地时间或 UTC 时间。/etc/adjtime
文件中的第三行确定在 Linux 启动时将硬件时钟时间复制到系统时钟时是否应用从本地时间到 UTC 时间的转换,或者是否假定硬件时钟直接使用 UTC 时间。面对时区和夏令时变化,后一种选择更为可靠,但从历史上看,Windows 假定系统时钟使用本地时间,因此 Linux 需要能够遵循这一点。