在我的所有 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",