如何在几秒钟内获得IBM AIX盒的正常运行时间?

时间:2010-01-15 13:14:33

标签: aix uptime

我正在编写一个Perl脚本,我需要在几秒钟内完成一些计算,在商店的所有机器(即linux,SunOS和AIX)中进行计算。我有办法获得linux(/ proc / uptime)和SunOS(kstat -p unix:0:system_misc:boot_time)的正常运行时间,这要归功于这个网站上的另一个帖子,但我能找到一个很好的方法来获取它用于AIX。我不太喜欢使用reg-ex解析正常运行时间的想法,因为正常情况下,当机器启动时间仅为几秒,几分钟,几天或一年以上时。

3 个答案:

答案 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