質問: uptime コマンドから、システムが稼働している日数と時間がわかります。システムが最後に再起動された正確な日付と時刻を表示する簡単な方法はありますか?つまり、システムが稼働していた正確な日付と時刻は?
回答: アップタイムはこの情報を間接的に提供します。次の例では、システムが「137 日 6 時間 13 分」稼働していることを示しています。ただし、これから正確な再起動日時をすぐに計算することはできません。
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
システムが「137 日 6 時間 13 分」稼働しているという代わりに、「5 月 14 日土曜日 20:38」(またはそれ)?これは、次の 3 つの方法のいずれかが行うこととまったく同じです。
1.最後のコマンド
「last reboot」コマンドを使用すると、システムの前回の再起動日時がすべて表示されます。これにより、/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.誰が指揮するのか
最後にシステムを再起動した日時を表示する「who -b」コマンドを使用してください。
$ who -b system boot 2011-05-14 20:38
3. perl コード スニペットを使用
稼働時間の出力を使用して最後の再起動時間を計算する必要がある場合は、手動で行うか、次の 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";'
この例では、上記のコード スニペットは次の出力を表示しました:
Sat May 14 20:38:39 2011
上記の perl コード スニペットをどこから入手したか正確には覚えていません。しかし、それは私がそれが何をするかを理解しようとするのを止めませんでした.この機会にちょっとした perl を学びましょう。これは、上記の perl コード スニペットが行うことです:
- -n は perl コマンド ライン オプションです。 perl プログラムが入力をループするようにします
- -e は perl コマンド ライン オプションです。 perl ワンライナーであることを示します (つまり、perl は「perl filename.pl」のようなファイル名を期待しません)。
以下は、使用される正規表現とその説明です:
- (?:(\d+) days?,? +) – 単一グループ
- (?:(\d+) 日?,? +)? – 疑問符の後にこのグループが続くと、このグループはオプションであることを示します
この部分は、稼働時間の出力に日の部分がある場合は、それをキャプチャするか、無視することを示しています。以下は、上記のグループを詳細に分類したものです。
- (?:pattern) – グループ化に使用される非キャプチャ括弧ですが、$1、$2 などの一致するメモリをキャプチャしません..
- (\d+) – 1 つ以上の数字に一致し、$1 に入れます (これが最初のグループであるため)
- スペースデイズ? – リテラル スペースの後に 1 日または 2 日が続くものと一致
- 、? – コンマはオプションです
- SPACE+ – 1 つ以上のスペース
以下は、このパターン (\d+):(\d+),.*/
を分解したものです。- (\d+) – 時間の部分を $2 にキャプチャ
- :– コロンが続きます
- (\d+) – 分の部分を $3 にキャプチャ
- , – コンマに一致
- .* – 他のすべてに一致
以下は、上記の perl コード スニペットの時間関数の残りの部分です。
- $total=((($1*24+$2)*60+$3)*60) – システムが稼働している合計秒数を計算します。つまり、(((日*24+時間)*60+分)*60 で秒が得られます (エポック計算のように)
- $今=時間(); – 現在の時間を秒単位で取得します (エポック時間)
- $now-=$total; – 現在の時刻から合計システム実行時間を引きます。したがって、これはシステムが開始された正確な時間を秒単位で取得しています
- $now=localtime($now); – エポック時間 (秒単位の時間) を変換します。 localtime は指定されたエポック時間を人間が読める形式で返します
- print $now,”\n” – 最後に時刻を出力します。