我正在编写一个 Perl 脚本,我需要在商店的所有机器(即 linux、SunOS 和 AIX)中以秒为单位进行一些计算。我有办法获得 linux (/proc/uptime) 和 SunOS (kstat -p unix:0:system_misc:boot_time) 的正常运行时间,这要感谢这个网站上的另一个帖子,但我可以找到一个很好的方法它适用于 AIX。我真的不喜欢用 reg-ex 解析正常运行时间的想法,因为当机器启动时正常运行时间会发生变化,只是几秒钟、几分钟、几天或一年以上。
3 回答
C 中的这个片段在 AIX 6.1 下工作。我不能给你源文章,因为我只剩下源代码了。
#include <utmpx.h>
int main ( )
{
int nBootTime = 0;
int nCurrentTime = time ( NULL );
struct utmpx * ent;
while ( ( ent = getutxent ( ) ) ) {
if ( !strcmp ( "system boot", ent->ut_line ) ) {
nBootTime = ent->ut_tv.tv_sec;
}
}
printf ( "System was booted %d seconds ago\n", nCurrentTime - nBootTime );
}
解析输出last(1)
?
查找仅在启动时创建/刷新的文件/目录并统计它?
坦率地说,使用不同的正则表达式来处理不同的可能输出uptime
听起来并不那么糟糕。
为新感兴趣的绊脚石回答旧线程。
我们将制作一个轻量级的 C 程序,称为getProcStartTime
您将有很多其他用途。给定 PID,它会告诉您进程何时启动。我相信即使这个过程是在几个月或几年前开始的,你仍然会得到一个精确到秒的时间戳。将此源代码保存为名为getProcStartTime.c的文件:
#include <time.h>
#include <procinfo.h>
main(argc, argv)
char *argv[];
{
struct procentry64 psinfo;
pid_t pid;
if (argc > 1) {
pid = atoi(argv[1]);
}
else {
printf("Usage : getProcStartTime pid\n");
return 1;
}
if (getprocs64(&psinfo, sizeof(struct procentry64), NULL, sizeof(struct fdsinfo64) , &pid, 1) > 0) {
time_t result;
result = psinfo.pi_start;
struct tm* brokentime = localtime(&result);
printf("%s", asctime(brokentime));
return 0;
} else {
perror("getproc64");
return 1;
}
}
然后编译它:
gcc getProcStartTime.c -o getProcStartTime
这是神奇的逻辑:AIX 就像 Linux 一样有一个init
使用 PID 1 调用的进程。它不能被杀死或重新启动。所以 PID 1 的开始时间就是你的服务器的启动时间。
./getProcStartTime 1
在我的服务器上,返回Wed Apr 23 10:33:30 2014;你的会有所不同。
请注意,我最初是getProcStartTime
专门为此目的制作的,但现在我在各种其他脚本中使用它。想知道 Oracle 数据库已经运行了多长时间?找到 Oracle 的 PMON 的 PID,然后将该 PID 作为您的 arg 传递getProcStartTime
。
如果您真的希望输出为整数秒,那么修改上面的代码将是一个简单的编程练习。这个名字getProcUptime
只是一个建议。然后你可以打电话:
./getProcUptime 1
更新: AIX 6.1/7.1 的源代码和预编译的二进制文件已放在我的 Github 存储库中:https ://github.com/Josholith/getProcStartTime