Как я могу получить время безотказной работы IBM AIX в секундах? - PullRequest
1 голос
/ 15 января 2010

Я пишу сценарий Perl, для которого мне требуется время безотказной работы в секундах для выполнения каких-либо вычислений на всех компьютерах в магазине (например, Linux, SunOS и AIX). У меня есть способ получить время безотказной работы для linux (/ proc / uptime) и SunOS (kstat -p unix: 0: system_misc: boot_time), благодаря другой публикации на этом сайте, но я могу найти хороший способ получить это для AIX. Мне не очень нравится идея разбора времени безотказной работы с помощью reg-ex, поскольку время безотказной работы меняется, когда машина работает всего за секунды, минуты, дни или более года.

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Этот фрагмент в 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 );
}
0 голосов
/ 22 мая 2014

Ответы на старые темы для новых заинтересованных участников.

Мы собираемся создать облегченную программу на языке 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

На моем сервере возвращает Ср. 23 апреля 10:33:30 2014 ;у вас все будет по-другому.

Обратите внимание, я изначально сделал getProcStartTime специально для этой цели, но теперь я использую его во всех видах других скриптов.Хотите знать, как долго работает база данных Oracle?Найдите PID Oracle PMON и передайте этот PID в качестве аргумента после getProcStartTime.

Если вы действительно хотите, чтобы вывод представлял собой целое число секунд, было бы легко программировать упражнение для изменения кода выше.Имя getProcUptime это просто предложение.Тогда вы можете просто позвонить:

./getProcUptime 1

ОБНОВЛЕНИЕ: Исходный код и предварительно скомпилированный бинарный файл для AIX 6.1 / 7.1 были помещены в мое репозиторий Github здесь: https://github.com/Josholith/getProcStartTime

0 голосов
/ 15 января 2010

Анализ выходных данных last(1)?

Найдите файл / каталог, который только создан / обновлен во время загрузки, и оцените его?

Откровенно говоря, используя различные регулярные выражения для обработки различныхвозможные выходы от uptime звучат не так плохо.

...