Domanda: Dal comando uptime, so per quanti giorni e ore il sistema è attivo e funzionante. Esiste un modo semplice per visualizzare la data e l'ora esatte dell'ultimo riavvio del sistema? ad es. Esattamente da quale data e ora il sistema è stato installato e funzionante?
Risposta: Uptime fornisce queste informazioni indirettamente. Nell'esempio seguente, indica che il sistema è attivo e funzionante da "137 giorni, 6 ore e 13 minuti". Tuttavia, non puoi calcolare rapidamente la data e l'ora esatte di riavvio da questo.
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
Invece di dire che il sistema è stato installato e funzionante negli ultimi "137 giorni, 6 ore e 13 minuti", non sarebbe carino se dicesse che il sistema è in esecuzione da "Sab 14 maggio 20:38" (o qualcosa del genere Quello)? Questo è esattamente ciò che fa uno qualsiasi dei seguenti tre metodi.
1. Ultimo comando
Utilizzare il comando "ultimo riavvio", che visualizzerà tutta la data e l'ora di riavvio precedenti per il sistema. Questo preleva le informazioni dal file /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. Chi comanda
Usa il comando 'who -b' che mostra la data e l'ora dell'ultimo riavvio del sistema.
$ who -b system boot 2011-05-14 20:38
3. Usa lo snippet di codice perl
Se insisti nell'utilizzare l'output del tempo di attività per calcolare l'ultimo tempo di riavvio, puoi farlo manualmente o utilizzare il seguente frammento di codice perl.
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 questo esempio, il frammento di codice precedente ha visualizzato il seguente output:
Sat May 14 20:38:39 2011
Non ricordo esattamente da dove ho ottenuto il frammento di codice perl sopra. Ma questo non mi ha impedito di cercare di capire cosa fa. Cogliamo l'occasione per imparare il piccolo perl. Questo è ciò che fa lo snippet di codice perl sopra:
- -n è l'opzione della riga di comando di Perl. Fa sì che il programma perl esegua un ciclo sull'input
- -e è l'opzione della riga di comando di Perl. Indica che è un perl one liner (cioè perl non si aspetta un nome di file, qualcosa come "perl filename.pl").
Di seguito sono riportate le espressioni regolari utilizzate e le relative spiegazioni:
- .*up + – Abbina qualsiasi cosa fino alla stringa "up" e uno o più spazi, per abbinare quanto segue dall'output del tempo di attività.
- (?:(\d+) giorni?,? +) – Gruppo singolo
- (?:(\d+) giorni?,? +)? – Il punto interrogativo seguito da questo gruppo dice che questo gruppo è facoltativo
Questa parte dice, se c'è una parte di giorni nell'output di uptime, acquisiscila o ignorala. Quanto segue scompone in dettaglio il gruppo sopra.
- (?:pattern) – Parentesi non catturante che viene utilizzata per raggruppare, ma non acquisisce la memoria abbinata che è $ 1, $ 2 ecc ..
- (\d+) – Abbina una o più cifre e inseriscila in $1 (perché questo è il primo gruppo)
- Giorni SPAZIALI? – Abbina lo spazio letterale seguito da giorno o giorni
- ,? – la virgola è facoltativa
- SPACE+ – uno o più spazi
Quanto segue scompone questo modello (\d+):(\d+),.*/
- (\d+) – Cattura la parte dell'ora in $ 2
- :– Seguito da due punti
- (\d+) – Cattura la parte dei minuti in $ 3
- , – Abbina la virgola
- .* – Abbina tutto il resto
Di seguito è riportato il resto della funzione del tempo nel frammento di codice perl sopra.
- $total=((($1*24+$2)*60+$3)*60) – Calcola la quantità totale di secondi in cui il sistema è attivo. cioè (((giorni*24+ore)*60+minuti)*60 che fornisce i secondi (come un calcolo di epoca)
- $ora=tempo(); – Ottieni l'ora corrente in secondi ( epoch time )
- $ora-=$totale; – Sottrarre il tempo di funzionamento totale del sistema dall'ora corrente. Quindi questo sta ottenendo l'ora esatta in secondi quando il sistema è stato avviato
- $ora=ora locale($ora); – Converti il tempo di epoch (tempo in secondi). localtime restituisce data epoch time in formato leggibile dall'uomo
- print $now,”\n” – Infine, questo stampa l'ora.