MacOS X (Yosemite) 上的系统记帐行为不当?

MacOS X (Yosemite) 上的系统记帐行为不当?

在我的所有 Unix(CentOS、FreeBSD、MacOS X)上,我都激活系统记帐作为基本安全规则。

在 MacOS X(Yosemite,10.10.3)上,我发现一个错误行为,我正在调查修复。

每次我运行lastcomm分析一组最近终止的进程时,我都会发现进程确实终止了,但日期来自未来,如下例所示:

••My_Mac••$lastcomm |更多的
lastcomm -X bob ttys007 0.00 秒 7 月 26 日星期一 14:13 (0:00:03.05)
更多 - bob ttys007 0.00 秒 7 月 26 日星期一 14:13 (0:00:03.05)
stty - bob ttys007 0.00 秒 7 月 26 日星期一 14:13 (0:00:00.05)
path_helpe - bob ttys007 0.00 秒 7 月 26 日星期一 14:13 (0:00:00.50)
sshd -SF _sshd __ 0.00 秒 1 月 27 日星期一 17:31 (0:00:04.91)
procmail -S bob __ 0.00 秒 Mon Jul 26 14:11 (0:00:00.09)
cron -F root __ 0.00 秒 6 月 1 日星期一 13:10 (0:00:00.33)
sendmail -S root __ 0.00 秒 6 月 1 日星期一 13:10 (0:00:00.31)
postdrop - root __ 0.00 秒 Mon Jun 1 13:10 (0:00:00.09)
[...]
••My_Mac••$日期
2015 年欧洲中部夏令时间 6 月 1 日星期一 13:12:07
••My_Mac••$

首先,问题并不像时区错误那么简单:

7 月 26 日 14:13(错误时间戳)和 6 月 1 日 13:10(正确时间戳)相差很多天。

这也不是由于date错误使用而导致的巨大时间漂移。此外,该服务器ntp在策略 1ntp服务器上同步。


其他人是否也看到过同样的不当行为?
您是否找到了更好地研究这个问题的方法?
这是一个已知的错误?

答案1

在 ElCapitan (MacOSX 10.11..) 上发现同样的错误行为。经过调查,发现 /var/account/acct 文件中的时间戳数据是正确的。编译lastcomm.c的源码
http://opensource.apple.com/tarballs/shell_cmds/shell_cmds-187.tar.gz
显示编译器消息“警告:不兼容的指针类型将'u_int32_t *'(又名'unsigned int *')传递给'const time_t *'(又名'const long *')类型的参数”

以下补丁修复了错误的会计时间戳我在埃尔卡皮坦。它可能适用于 Yosemite (10.10..) 及更早版本。

*** 最后通信.c 2016/08/26 19:44:23 1.1
---lastcomm.c 2016/08/27 00:30:49 1.2
**************
*** 135,138 ****
--- 135,140 ----
        if (!*argv || 请求(argv, &ab)) {

+ time_t 时间长;
+ timelong = ab.ac_btime;
            t = 展开(ab.ac_utime) + 展开(ab.ac_stime);
            (无效)printf(
**************
*** 144,148 ****
                 user_from_uid(ab.ac_uid, 0), UT_LINESIZE,
                 UT_LINESIZE, getdev(ab.ac_tty),
! t / (双)AHZ, ctime(&ab.ac_btime));
            delta = 展开(ab.ac_etime) / (double)AHZ;
            printf(" (%1.0f:%02.0f:%05.2f)\n",
--- 146,150 ----
                 user_from_uid(ab.ac_uid, 0), UT_LINESIZE,
                 UT_LINESIZE, getdev(ab.ac_tty),
! t / (双)AHZ, ctime(&timelong));
            delta = 展开(ab.ac_etime) / (double)AHZ;
            printf(" (%1.0f:%02.0f:%05.2f)\n",

相关内容