Question : À partir de la commande uptime, je sais combien de jours et d'heures le système est opérationnel. Existe-t-il un moyen simple d'afficher la date et l'heure exactes du dernier redémarrage du système ? c'est-à-dire à partir de quelle date et heure exactes le système a été opérationnel ?
Réponse : La disponibilité donne cette information indirectement. Dans l'exemple suivant, il indique que le système est opérationnel depuis « 137 jours, 6 heures et 13 minutes ». Mais, vous ne pouvez pas calculer rapidement la date et l'heure exactes de redémarrage à partir de cela.
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
Au lieu de dire que le système est opérationnel depuis les derniers "137 jours, 6 heures et 13 minutes", ce ne serait pas bien s'il était indiqué que le système fonctionnait depuis "Sat May 14 20:38" (ou quelque chose comme ce)? C'est exactement ce que fait l'une des trois méthodes suivantes.
1. Dernière commande
Utilisez la commande "last reboot", qui affichera toutes les dates et heures de redémarrage précédentes du système. Ceci récupère les informations du fichier /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. Qui commande
Utilisez la commande "who -b" qui affiche la date et l'heure du dernier redémarrage du système.
$ who -b system boot 2011-05-14 20:38
3. Utilisez l'extrait de code perl
Si vous insistez pour utiliser la sortie de disponibilité pour calculer l'heure du dernier redémarrage, vous pouvez le faire manuellement ou utiliser l'extrait de code perl suivant.
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";'
Dans cet exemple, l'extrait de code ci-dessus affiche le résultat suivant :
Sat May 14 20:38:39 2011
Je ne me souviens pas exactement d'où j'ai obtenu l'extrait de code perl ci-dessus. Mais cela ne m'a pas empêché d'essayer de comprendre ce qu'il fait. Profitons-en pour apprendre le petit perl. Voici ce que fait l'extrait de code perl ci-dessus :
- -n est l'option de ligne de commande perl. Provoque une boucle du programme perl sur l'entrée
- -e est l'option de ligne de commande perl. Indique qu'il s'agit d'une ligne perl (c'est-à-dire que perl n'attendra pas de nom de fichier, quelque chose comme "perl filename.pl").
Voici la Regex utilisée et ses explications :
- .*up + - Correspond à n'importe quoi jusqu'à la chaîne "up" et un ou plusieurs espaces, pour faire correspondre ce qui suit à partir de la sortie de disponibilité.
- (?:(\d+) jours ?, ? +) – Groupe unique
- (?:(\d+) jours ?, ? +) ? – Le point d'interrogation suivi de ce groupe indique que ce groupe est facultatif
Cette partie indique, s'il y a une partie jours dans la sortie de disponibilité, capturez-la ou ignorez-la. Ce qui suit détaille le groupe ci-dessus.
- (?:pattern) - Parenthèse non capturante qui est utilisée pour regrouper, mais ne capture pas la correspondance avec la mémoire qui est $1, $2 etc ..
- (\d+) – Faites correspondre un ou plusieurs chiffres et placez-le dans $1 (car il s'agit du premier groupe)
- Journées SPACE ? – Faites correspondre l'espace littéral suivi du jour ou des jours
- , ? – la virgule est facultative
- ESPACE+ – un ou plusieurs espaces
Ce qui suit décompose ce modèle (\d+):(\d+),.*/
- (\d+) – Capturez la partie heure en 2 $
- :– suivi de deux-points
- (\d+) – Capturez la partie minute en 3 $
- , – Virgule correspondante
- .* – Correspond à tout le reste
Voici le reste de la fonction de temps dans l'extrait de code perl ci-dessus.
- $total=((($1*24+$2)*60+$3)*60) – Calcule le nombre total de secondes pendant lesquelles le système est UP. c'est-à-dire (((jours*24+heures)*60+minutes)*60 qui donne les secondes (comme un calcul d'époque)
- $maintenant=temps(); – Obtenir l'heure actuelle en secondes (epoch time)
- $maintenant-=$total ; – Soustraire le temps de fonctionnement total du système de l'heure actuelle. Il s'agit donc d'obtenir l'heure exacte en secondes à laquelle le système a été démarré
- $maintenant=heurelocale($maintenant); – Convertir le temps de l'époque (temps en secondes). localtime renvoie l'heure donnée dans un format lisible par l'homme
- print $now,”\n” – Enfin, cela imprime l'heure.