自宅で小さなLinuxサーバーを実行していて、5秒ごとにCPUコアの温度をログに記録するスクリプトを書いていますが、それを使用するにはタイムスタンプが必要です。これまでのところ、sensors
コマンドの出力をファイルに保存するものと、日付と時刻を出力するコマンドがあります。 これら2つを組み合わせる方法を理解する必要があります。
sensors | grep ^Core* >> temps.log
は、temps.logに次の形式でtempsを保存します。
Core 0: +39.0°C (high = +76.0°C, crit = +100.0°C)
Core 1: +40.0°C (high = +76.0°C, crit = +100.0°C)
そして私ができる日付のためにdate +%m/%d/%y-%H:%M:%S
が返されます
mm/dd/yy-hh:mm:ss
私はググってみて、誰かがgawk
の使用を提案しているのを見ましたが、gawk
がどのように機能するかまったくわかりません。
私が正しく理解している場合、達成したいことは、grepによって出力されるすべての行に現在の日付を付加することです。これは、bashスクリプトの簡単なタスクです。
sensors | grep ^Core |\
(
DATE=$(date +%m/%d/%y-%H:%M:%S)
while read LINE
do
echo "$DATE $LINE"
done
) >> temps.log
ログに記録するスクリプト[…] 5秒ごと[…]タイムスタンプが必要[…]ループ[…]ファイルが特定のサイズに達する
メインプログラムのログ出力を入力として受け取り、サイズ制限のあるログファイルに書き込み、タイムスタンプを追加するツールが必要です。これ以上のことを行うツールが存在します。彼らが行う「詳細」は、ログファイルの自動ローテーションであり、必要に応じてトリガーすることもでき、現在および古いサイズ制限のログディレクトリを維持します。ログファイル。
ツールには次の選択肢があります。
multilog
daemontoolsからmultilog
daemontools-encoreからs6-log
s6からsvlogd
runitからtinylog
perpからcyclog
noshから次のような、数秒ごとに必要なログ出力を出力する長時間実行ユーティリティを想定します。
#!/ bin/sh #monitor-sensors exec 2>&1 true do センサー スリープ5 完了| grep --line-buffered-'^ Core'
使い方は簡単です:
monitor-sensors | cyclog ./temps
monitor-sensors | multilog t ./temps
簡単に調整できます:
monitor-sensors | cyclog --max-file-size 32768 --max-total-size 1048576 ./temps
monitor-sensors | s6-log t s32768 S1048576 ./temps
monitor-sensors | multilog t s32768 n5 ./temps
ここから、daemontools-encore/runit/perp/s6/noshのようなツールセットを使用して、このパイプの左側と右側をrun
プログラムに移動し、これをリンクされたペアとして実行するのはほんの少しのステップです実際のデーモンの。
ただし、コマンドラインから1回限りの呼び出しを実行したいだけの場合は、既存のログディレクトリへの1回限りの出力をスピンアップすることもできます。
これらのツールのいくつかは、他の形式のタイムスタンプを実行できますが、すべてTAI64Nタイムスタンプを実行できます。 TAI64Nタイムスタンプは、ナノ秒の精度が可能になるように設計されていますが、前述の一部はこれを完全には実装していません。 TZデータベースがうるう秒を認識している限り、うるう秒などの問題にうまく対処できるように設計されています。 sort
やsort -m
。
次のようなツールを使用して、TAI64Nタイムスタンプから現在のタイムゾーンのローカルタイム(または、選択した任意のタイムゾーンであるTZ
環境変数の場合)に変換します。
tai64nlocal
daemontoolsからtai64nlocal
daemontools-encoreからtai64nlocal
noshからそれらが書かれているようなログを見てください:
tail -F
、ただし非常に高速なローテーションがある場合、tail
には既知の問題があります。 (これは、tail
に関するいくつかの既知の問題の1つです。他の既知の問題は、ログファイルのインプレーストランケーションの処理を含み、その後により多くのログデータが続きます。この問題は、logrotate
。幸いなことに、前述のツールは、完全に書き込まれた後はファイルを切り捨てず、そのような追加のtail
問題のリスクもありません。)follow-log-directories
from nosh。これは、この種のログディレクトリを「認識」し、「カーソル」(ディスク上に永続的に維持される)を使用して、ログディレクトリ内の位置を確実に追跡し、ログフォロワーが複数回ローテーションした場合でも継続するようにします。見ていません。他の種類の処理は、次のようなツールで実行できます。
multilog-watch
logrange
multilog-stamptail
export-to-rsyslog
noshから@JdeBPはあなたがおそらくやるべきことをすでに答えています。しかし、それはあなたがした質問ではありませんでした。したがって、複数行の出力に物事を追加/追加する方法を知るためにGoogleからここに到着した人には、次のようになります。
まず、^Core*
は、おそらくあなたが思っていることをしていません。これは、「Cor」で始まり、直後に任意の数の「e」が続く行に一致する正規表現です。「Cor」、「Core」、「Coreeeee」など。
第二に、xargs
は、特にワンライナーやダーティクイックスクリプトに最適なツールです。 xargs
を使用して、入力の各行を処理し、パラメーター-I
を使用して各行にコマンドを発行できます。したがって、次のようなことを簡単に行うことができます。
sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log
そこに'^Core*'
を付けて引用符で囲みます。予期しない(非常にありそうもありませんが)シェル展開をしたくないからです。 {}
の-I
は、xargs
に{}
を、実行するコマンドの引数の入力の各行で置き換えるように指示します。もちろん、別のパターンを選択することもできます。 find -exec
の構文を模倣したいだけです。 ${stamp}
は、日付/時刻をstamp
に保存したことを前提としています。
サブシェルを発生させ、date
コマンドを実行し(必要な形式を指定)、xargs
にecho
への引数の一部としてその標準出力を使用させることもできます。
sensors | grep '^Core*' | xargs -I{} echo "$(date): {}" >> temps.log
繰り返しますが、おそらくを実行することは、テスト済みの管理されたツールをログに使用することです。しかし、私はここで答えていますgrep出力にタイムスタンプを追加/追加する方法、適切にログを作成する方法ではありません。
私はおそらくそうするでしょう:
parallel --tagstring `date -Iseconds` 'sensors | grep' ::: ^Core
それは短く、人間が読める形式で、見事にソートされています。