我正在编写一个Perl脚本,我需要在几秒钟内完成一些计算,在商店的所有机器(即linux,SunOS和AIX)中进行计算。我有办法获得linux(/ proc / uptime)和SunOS(kstat -p unix:0:system_misc:boot_time)的正常运行时间,这要归功于这个网站上的另一个帖子,但我能找到一个很好的方法来获取它用于AIX。我不太喜欢使用reg-ex解析正常运行时间的想法,因为正常情况下,当机器启动时间仅为几秒,几分钟,几天或一年以上时。
答案 0 :(得分:2)
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 );
}
答案 1 :(得分:0)
解析last(1)
的输出?
查找仅在启动时创建/刷新并对其进行统计的文件/目录?
坦率地说,使用不同的正则表达式来处理来自uptime
的不同输出并不是那么糟糕。
答案 2 :(得分:0)
为新感兴趣的笨蛋回答旧帖。
我们将制作一个名为getProcStartTime
的轻量级C程序,您将有很多其他用途。它会在给定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并在getProcStartTime
之后将该PID作为arg传递。
如果你真的希望输出为整数秒,那么修改上面的代码将是一个简单的编程练习。名称getProcUptime
只是一个建议。然后你可以打电话:
./getProcUptime 1
更新: AIX 6.1 / 7.1的源代码和预编译二进制文件已放在我的Github repo上:https://github.com/Josholith/getProcStartTime