2016-04-29 10 views
1

Ich bekomme Linux Verfügbarkeit von Datei/proc/uptime. Von wo die letzte Stillstandszeit der Maschine erhalten wird. wie man es aus der wtmp-Datei in "c" liest. Ich möchte die Ausgabe des letzten Befehls -x nicht parsen. Kann ich sysctl benutzen?Linux: Programmatisch System-Shutdown-Zeit bekommen?

Danke !!

+0

Was Verteilung und die Versionsnummer werden Sie mit (Ubuntu 14.04, CentOS 7, usw. .) Verschiedene Init-Systeme können verschiedene Informationen zu wtmp schreiben. –

Antwort

3

Unter Linux ist diese Art von Daten Zugriff über die getutent API-Aufrufe. Sie können utmpname verwenden, um den Dateinamen festzulegen, und getutent verwenden, um jeden Eintrag in dem Login-Verlauf abzurufen.

Einzelheiten der API Kasse http://linux.die.net/man/3/getutent

Das Format der Datei auf http://linux.die.net/man/5/utmp

EDIT

Denn wie speziell die Abschaltzeit erhalten beschrieben wird, überprüfen Sie die ut_user der struct utmp zurück durch die API, und machen Sie etwas, wenn es shutdown ist, zum Beispiel durchlaufen Sie alle Einträge in der Datei mit diesem Code:

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

folgenden Code erfolgreich alle Shutdown-Einträge auf meinem System identifiziert:

#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; 
} 

Ausgang auf meinem System:

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

es gibt keine Abschaltzeit. Ich kann BOOT_TIME mit getutent api bekommen. –

+0

@RaviBhushan Es hat Zeit zum Herunterfahren, siehe meine Post. – fluter

+0

Wenn die Bedingung nicht erfüllt ist. Ich habe "ut.ut_user" vor wenn Bedingung gedruckt. Es gibt keinen Benutzer "Herunterfahren". Ich bekomme Benutzer Neustart, Runlevel und normalen Benutzer. –