1

我正在编写一个 Perl 脚本,我需要在商店的所有机器(即 linux、SunOS 和 AIX)中以秒为单位进行一些计算。我有办法获得 linux (/proc/uptime) 和 SunOS (kstat -p unix:0:system_misc:boot_time) 的正常运行时间,这要感谢这个网站上的另一个帖子,但我可以找到一个很好的方法它适用于 AIX。我真的不喜欢用 reg-ex 解析正常运行时间的想法,因为当机器启动时正常运行时间会发生变化,只是几秒钟、几分钟、几天或一年以上。

4

3 回答 3

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 );
}
于 2010-11-15T21:44:57.680 回答
0

解析输出last(1)

查找仅在启动时创建/刷新的文件/目录并统计它?

坦率地说,使用不同的正则表达式来处理不同的可能输出uptime听起来并不那么糟糕。

于 2010-01-15T20:56:08.570 回答
0

为新感兴趣的绊脚石回答旧线程。

我们将制作一个轻量级的 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

于 2014-05-22T19:39:22.847 回答