如何让应用程序检测 Linux 中的系统时间是否已改变

如何让应用程序检测 Linux 中的系统时间是否已改变

我需要编写一个小应用程序,它需要检测系统时间是否被另一个应用程序/用户更改,并在检测到时立即执行某些操作(可能记录时间已更改的数据,以及有关哪个应用程序/用户更改它的信息)。

如何实现这一点?

  1. 我有丰富的 shell 脚本、c 编程经验,并且具有初级的 python 编程经验。
  2. 我不需要知道它何时被改变,只需要知道谁/什么改变了它。
  3. 系统使用 NTP 来同步时间,但任何人/任何应用程序也可以更改时间(例如:使用简单的“date”命令)。

答案1

我认为这篇文章可以回答你的问题:通知用户空间时间变化。但请注意,文章中提到的补丁是相当新的,因此您必须先检查您的 Linux 内核版本。

如果你的内核不是支持用户空间通知机制,那么可以实现如下算法(伪代码):

time = gettimeofday()

loop:
    sleep 1 second
    new_time = gettimeofday()
    if (time_diff(new_time, time) > 2 seconds) then
       alert System time has changed by an external user/process!

    time = new_time
    goto loop

希望这可以帮助。

答案2

您想使用 timerfd_settime() 和TFD_TIMER_CANCEL_ON_SETtimerfd_settime(2)):

  TFD_TIMER_CANCEL_ON_SET
              If this flag is specified along with TFD_TIMER_ABSTIME and the
              clock for this timer is CLOCK_REALTIME or CLOCK_REAL‐
              TIME_ALARM, then mark this timer as cancelable if the real-
              time clock undergoes a discontinuous change (settimeofday(2),
              clock_settime(2), or similar).  When such changes occur, a
              current or future read(2) from the file descriptor will fail
              with the error ECANCELED.

答案3

系统调用追踪器做你想做的事。你可以使用/修改该代码。

相关内容