2016-04-29 19 views
1

Я получаю время автономной работы Linux из файла/proc/uptime. Оттуда, чтобы получить последнее время выключения машины. как читать его из файла wtmp в «c». Мне не нужен синтаксический анализ последней команды -x. могу ли я использовать sysctl?Linux: программно получить время выключения системы?

Спасибо!

+0

Какое распределение и номер версии, которую вы используете (Ubuntu 14.04, CentOS 7 и т.д. .)? Различные системы инициализации могут писать различную информацию в wtmp. –

ответ

3

В Linux такой вид данных - это доступ через вызовы api getutent. Вы можете использовать utmpname для установки имени файла и использовать getutent, чтобы получить каждую запись в истории входа.

Для получения дополнительной информации о API проверки http://linux.die.net/man/3/getutent

Формат файла описан в http://linux.die.net/man/5/utmp

EDIT

для того, как получить время отключения в частности, проверить ut_user из struct utmp, возвращаемой API, и что-то сделать, если это shutdown, например, просмотреть все записи в файле с этим кодом:

struct utmp *u = getutent(); 
if (strncmp(u>ut_user, "shutdown", 8) == 0) { 
    // parse the shutdown time in u->ut_time 
} 

После кода успешно определены все элементы отключения на моей системе:

#include <errno.h> 
#include <stdbool.h> 
#include <stdio.h> 
#include <string.h> 
#include <utmp.h> 

int main(void) 
{ 
    struct utmp *u; 
    int ret; 

    ret = utmpname("/var/log/wtmp"); 
    if (ret < 0) { 
      perror("utmpname"); 
      return 1; 
    } 
    while (true) { 
      u = getutent(); 
      if (!u) { 
        perror("getutent"); 
        break; 
      } 
      if (strncmp(u->ut_user, "shutdown", 8) == 0) { 
        time_t t = u->ut_time; 
        struct tm *tm = localtime(&t); 
        char timestr[128]; 

        strftime(timestr, sizeof timestr, "%a %b %d %T %Y", tm); 
        printf("%s: %s\n", u->ut_user, timestr); 
      } 
    } 
    return 0; 
} 

Выход на моей системе:

shutdown: Tue Mar 08 00:13:00 2016 
shutdown: Sat Mar 12 08:45:57 2016 
shutdown: Sat Mar 19 09:55:49 2016 
shutdown: Wed Mar 23 16:24:39 2016 
.... 
+0

не обеспечивает время выключения. Я могу получить BOOT_TIME с помощью getutent api. –

+0

@RaviBhushan У этого есть время выключения, см. Мой пост. – fluter

+0

Если условие не удовлетворяет. Я напечатал «ut.ut_user» раньше, если условие. нет «выключения» пользователя. я получаю перезагрузку пользователя, уровень запуска и обычный пользователь. –