J'ai besoin de calculer la différence de temps entre deux messages du journal /var/log/messages. Comme nous savons que les messages de log sont préfixés par la date et l'heure, je veux calculer la différence de temps entre deux entrées de log.
Réponses
Trop de publicités?En bash, une fois que vous avez déterminé la date et l'heure que vous souhaitez utiliser, vous pouvez écrire
firsttime="Jun 1 02:00:13"
secondtime="Jun 1 03:00:46"
echo $(( $(date -d "$secondtime" +"%s") - $(date -d "$firsttime" +"%s") ))
Ce qui vous donnera le nombre de secondes entre ces deux temps. Si vous voulez automatiser la recherche de firsttime et secondtime, vous allez devoir nous dire ce que vous cherchez exactement dans le journal.
Je suppose que vous voulez trouver le plus grand écart de temps entre deux messages de journal consécutifs. Si c'est le cas, vous trouverez ci-dessous un script qui devrait faire l'affaire. J'ai écrit ce script il y a quelques années pour imprimer un intervalle de temps particulier à partir du fichier de messages, et il était assez facile à personnaliser :
#!/usr/bin/perl -W
use strict;
use Time::Local;
my %MONTHS = ( "Jan" => 0, "Feb" => 1, "Mar" => 2, "Apr" => 3, "May" => 4, "Jun" => 5,
"Jul" => 6, "Aug" => 7, "Sep" => 8, "Oct" => 9, "Nov" => 10, "Dec" => 11 );
# Messages file doesn't include the year, so we need to assume that
# all messages are less than a year old and make some guesses
my $currenttime = time();
my $currentyear = (localtime($currenttime))[5];
my $currentmonth = (localtime($currenttime))[4];
my $largestgap;
my $largestgapbefore;
my $largestgapafter;
my $lasttime;
my $lastmsg;
open(FILE, "</var/log/messages") || die "Unable to open messages file: $!\n";
while(<FILE>) {
chomp;
/^(...) (..) (..):(..):(..)/;
my $year = $currentyear;
if($MONTHS{$1} > $currentmonth) {$year -= 1; }
my $time = timelocal($5, $4, $3, $2, $MONTHS{$1}, $year);
if(defined($lasttime)) {
my $gap = $time - $lasttime;
if(!defined($largestgap) || $gap > $largestgap) {
$largestgap = $gap;
$largestgapbefore = $lastmsg;
$largestgapafter = $_;
}
}
$lasttime = $time;
$lastmsg = $_;
}
close(FILE);
if(!defined($lasttime)) {
print "No entries in log file.\n";
exit;
}
print "Largest gap was: " . $largestgap . " seconds.\n";
print "Entry before the gap: " . $largestgapbefore . "\n";
print " Entry after the gap: " . $largestgapafter . "\n";
J'ai choisi le premier et le dernier message de la rubrique /var/log/messages
pour la démonstration, vous devrez la modifier pour obtenir vos propres heures de début et de fin.
#!/bin/bash
start=$(head -n 1 /var/log/messages | awk {'print $1, $2,$3'})
finish=$(tail -n 1 /var/log/messages | awk {'print $1, $2,$3'})
start_secs=$(date -d "$start" +"%s")
finish_secs=$(date -d "$finish" +"%s")
let diff_secs=($finish_secs - $start_secs)
let days=$diff_secs/86400
let remainder=$diff_secs%86400
let hours=$remainder/3600
let remainder=$remainder%3600
let minutes=$remainder/60
let seconds=$remainder%60
echo "Days = $days, Hours = $hours, Minutes = $minutes, Seconds = $seconds"