Otázka: Z příkazu uptime vím, kolik dní a hodin je systém v provozu. Existuje snadný způsob, jak zobrazit přesné datum a čas, kdy byl systém naposledy restartován? tj. Od jakého data a času přesně byl systém spuštěn?
Odpověď: Uptime poskytuje tyto informace nepřímo. V následujícím příkladu to znamená, že systém byl v provozu „137 dní, 6 hodin a 13 minut“. Z toho však nemůžete rychle vypočítat přesné datum a čas restartu.
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
Namísto sdělení, že systém byl v provozu za posledních „137 dní, 6 hodin a 13 minut“, by nebylo hezké, kdyby bylo uvedeno, že systém běží od „so 14. května 20:38“ (nebo něco podobného že)? To je přesně to, co dělá kterákoli z následujících tří metod.
1. Poslední příkaz
Použijte příkaz „last reboot“, který zobrazí datum a čas předchozího restartu systému. Toto vybírá informace ze souboru /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. Kdo velí
Použijte příkaz „who -b“, který zobrazí datum a čas posledního restartu systému.
$ who -b system boot 2011-05-14 20:38
3. Použijte úryvek kódu perl
Pokud trváte na použití výstupu uptime k výpočtu doby posledního restartu, můžete to udělat ručně nebo použít následující úryvek kódu 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";'
V tomto příkladu výše uvedený fragment kódu zobrazil následující výstup:
Sat May 14 20:38:39 2011
Nepamatuji si přesně, odkud jsem získal výše uvedený fragment kódu v perlu. To mi však nezabránilo v pokusu zjistit, co to dělá. Využijme této příležitosti a naučte se malý perl. Výše uvedený úryvek kódu v perlu dělá toto:
- -n je volba příkazového řádku perlu. Způsobí, že program v perlu zacyklí vstup
- -e je volba příkazového řádku perlu. Označuje, že se jedná o perl one liner (tj. perl nebude očekávat název souboru, něco jako „perl filename.pl“).
Následuje použitý regulární výraz a jeho vysvětlení:
- .*up + – Přiřaďte cokoli, dokud nebude řetězec „up“ a jedna nebo více mezer, aby bylo možné porovnat následující položky z výstupu dostupnosti.
- (?:(\d+) dnů?,? +) – Jedna skupina
- (?:(\d+) dnů?,? +)? – Otazník za touto skupinou říká, že tato skupina je volitelná
Tato část říká, že pokud je ve výstupu uptime část dní, zachyťte ji nebo ignorujte. Následující text podrobně rozebírá výše uvedenou skupinu.
- (?:pattern) – Nezachycující závorky, které se používají k seskupování, ale nezachycují odpovídající do paměti, což je $1, $2 atd..
- (\d+) – Porovnejte jednu nebo více číslic a vložte ji do $1 (protože toto je první skupina)
- SPACE dní? – Porovnejte doslovnou mezeru následovanou dnem nebo dny
- ,? – čárka je volitelná
- SPACE+ – jedna nebo více mezer
Následující text rozděluje tento vzor (\d+):(\d+),.*/
- (\d+) – Zachyťte část hodiny do $2
- :– Následuje dvojtečka
- (\d+) – Zachyťte minutovou část do $3
- – Odpovídající čárka
- .* – Shoduje se se vším ostatním
Následuje zbytek funkce času ve výše uvedeném úryvku kódu v perlu.
- $total=(((($1*24+$2)*60+$3)*60) – Vypočítejte celkový počet sekund, po které je systém NAHORU. tj. (((dny*24+hodiny)*60+minuty)*60, což udává sekundy (jako výpočet epochy)
- $now=time(); – Získejte aktuální čas v sekundách (čas epochy)
- $nyní-=$celkem; – Odečtěte celkovou dobu běhu systému od aktuálního času. Takže toto je přesný čas v sekundách, kdy byl systém spuštěn
- $now=localtime($now); – Převeďte čas epochy ( čas v sekundách ). localtime vrací daný čas epochy ve formátu čitelném pro člověka
- vytisknout $now,”\n” – Nakonec se vytiskne čas.