Frage: Aus dem Uptime-Befehl weiß ich, wie viele Tage und Stunden das System betriebsbereit ist. Gibt es eine einfache Möglichkeit, das genaue Datum und die Uhrzeit des letzten Neustarts des Systems anzuzeigen? d.h. seit wann genau läuft das System?
Antwort: Uptime gibt diese Informationen indirekt weiter. Im folgenden Beispiel bedeutet dies, dass das System seit „137 Tagen, 6 Stunden und 13 Minuten“ in Betrieb ist. Sie können daraus jedoch nicht schnell das genaue Datum und die Uhrzeit des Neustarts berechnen.
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
Anstatt zu sagen, dass das System die letzten „137 Tage, 6 Stunden und 13 Minuten“ in Betrieb war, wäre es nicht schön, wenn es heißt, dass das System seit „Sa 14. Mai 20:38“ läuft (oder so ähnlich). das)? Genau das macht jede der folgenden drei Methoden.
1. Letzter Befehl
Verwenden Sie den Befehl „letzter Neustart“, der das Datum und die Uhrzeit des vorherigen Neustarts für das System anzeigt. Dies entnimmt die Informationen aus der Datei /var/log/wtmp.
$ last reboot reboot system boot 2.6.32-100.28.5. Sat May 14 20:38 - 23:55 (137+06:16) reboot system boot 2.6.32-100.28.5. Sun Apr 24 21:28 - 23:37 (15+09:08) wtmp begins Thu Sun 24 17:28:47 2011
2. Wer befehligt
Verwenden Sie den Befehl „who -b“, der Datum und Uhrzeit des letzten Systemneustarts anzeigt.
$ who -b system boot 2011-05-14 20:38
3. Verwenden Sie das Perl-Code-Snippet
Wenn Sie darauf bestehen, die Uptime-Ausgabe zu verwenden, um die letzte Neustartzeit zu berechnen, können Sie dies manuell tun oder das folgende Perl-Code-Snippet verwenden.
uptime | \ perl -ne '/.*up +(?:(\d+) days?,? +)?(\d+):(\d+),.*/; $total=((($1*24+$2)*60+$3)*60); $now=time(); $now-=$total; $now=localtime($now); print $now,"\n";'
In diesem Beispiel zeigte das obige Code-Snippet die folgende Ausgabe:
Sat May 14 20:38:39 2011
Ich weiß nicht mehr genau, woher ich das obige Perl-Code-Snippet habe. Aber das hat mich nicht davon abgehalten, herauszufinden, was es tut. Lassen Sie uns diese Gelegenheit nutzen, um etwas Perl zu lernen. Das macht das obige Perl-Code-Snippet:
- -n ist eine Perl-Befehlszeilenoption. Veranlasst das Perl-Programm, die Eingabe zu durchlaufen
- -e ist eine Perl-Befehlszeilenoption. Zeigt an, dass es sich um einen Perl-Einzeiler handelt (d. h. Perl erwartet keinen Dateinamen, etwa „perl filename.pl“).
Im Folgenden sind der verwendete Regex und seine Erläuterungen aufgeführt:
- .*up + – Übereinstimmung mit allem bis zur Zeichenfolge „up“ und einem oder mehreren Leerzeichen, um Folgendes aus der Verfügbarkeitsausgabe abzugleichen.
- (?:(\d+) Tage?,? +) – Einzelne Gruppe
- (?:(\d+) Tage?,? +)? – Fragezeichen gefolgt von dieser Gruppe bedeutet, dass diese Gruppe optional ist
Dieser Teil sagt, wenn es einen Teil der Betriebszeit gibt, erfassen Sie ihn oder ignorieren Sie ihn. Im Folgenden wird die obige Gruppe im Detail aufgeschlüsselt.
- (?:pattern) – Nicht erfassende Klammern, die zum Gruppieren verwendet werden, aber nicht den übereinstimmenden Speicher erfassen, der $1, $2 usw. ist.
- (\d+) – Passen Sie eine oder mehrere Ziffern an und fügen Sie sie in $1 ein (weil dies die erste Gruppe ist)
- Weltraumtage? – Übereinstimmung mit dem wörtlichen Leerzeichen, gefolgt von Tag oder Tagen
- ,? – Komma ist optional
- SPACE+ – ein oder mehrere Leerzeichen
Im Folgenden wird dieses Muster aufgeschlüsselt (\d+):(\d+),.*/
- (\d+) – Erfasst den Stundenteil in $2
- :– Gefolgt von einem Doppelpunkt
- (\d+) – Erfassen Sie den Minutenteil in $3
- , – Übereinstimmungskomma
- .* – Passen Sie alles andere an
Es folgt der Rest der Zeitfunktion im obigen Perl-Code-Snippet.
- $total=((($1*24+$2)*60+$3)*60) – Berechnen Sie die Gesamtzeit in Sekunden, in denen das System UP ist. d.h. (((Tage*24+Stunden)*60+Minuten)*60 was die Sekunden ergibt (wie eine Epochenberechnung)
- $jetzt=Zeit(); – Holen Sie sich die aktuelle Zeit in Sekunden ( Epochenzeit )
- $jetzt-=$gesamt; – Subtrahieren Sie die gesamte Systemlaufzeit von der aktuellen Uhrzeit. Das ist also die genaue Zeit in Sekunden, wann das System gestartet wurde
- $jetzt=Ortszeit($jetzt); – Konvertieren Sie die Epochenzeit ( Zeit in Sekunden ). localtime gibt die gegebene Epochenzeit in menschenlesbarem Format zurück
- print $now,”\n” – Schließlich wird die Zeit gedruckt.