web-dev-qa-db-ja.com

リクエストに応じて出力を新しいファイルに動的にリダイレクトするツールはありますか

現在、監視ツールの出力をファイルにリダイレクトしていますが、このツールを停止せずに、要求に応じて(キーバインドを使用して)この出力を新しいファイルにリダイレクトします。

何かのようなもの

monitor_program | handle_stdout

どこ handle_stdoutを使用すると、特定の時点でログを配置する新しいファイルを定義できます。

簡単に書けるとは思いますが、すでにこれを可能にしているツールはないかと思います。

8
Treviño

名前付きパイプをお勧めします。

  1. パイプを作成するmkfifo p( 'p'でない場合は、好きなように呼んでください)

  2. パイプから読み取り、好きな場所に書き込む「リーダー」スクリプトを作成します

  3. 名前付きパイプにログを書き込むように監視プログラムに指示します

名前付きパイプ「p」から読み取り、インデックス付きの「mylog」ファイルにデータを書き込むサンプルリーダースクリプトを次に示します。

#!/bin/sh

INDEX=0

switchlog() {
  read INDEX < newindex
  echo now writing to "mylog.$INDEX"
}

trap switchlog USR1

while :
do
  cat p >> mylog."$INDEX"
done
9
Jeff Schaller

ここでSIGQUITを使用して、SIGINTのアイデアを構築します(Ctrl+\)あなたはまだ使用することができます Ctrl+C 全体を止めるには:

(trap '' QUIT; monitor_command) | (
   trap : QUIT
   ulimit -c 0 # prevent core dump so SIGQUIT behaves like SIGINT
               # for cat
   n=0; while n=$((n+1)); file=output.$n.log; do
     printf 'Outputting to "%s"\n' "$file"
     cat > "$file"
   done)

これは、catがシェルに組み込まれていないことを前提としています(したがって、を押すと中断されます Ctrl+\)。

あなたのアプローチのように、SIGQUITが間違った時間に(writeシステムコールで)配信され、一部のデータが失われる可能性があることに注意してください。

7

おそらくlessを使用し、そこから入力して保存することができます s 次に、保存先のファイル名、次に Enter。 From lessからfileにすべての行を書き込むにはどうすればよいですか?

1
BenjaminH

Jeff Schallerの答え のおかげで、私はこのようなものになりました。これは基本的に必要なことを実行します。それをreader.shと呼びましょう。

#!/bin/sh

INDEX=0
LOGNAME="$INDEX.log"

switchlog() {
  local custom_name
  read -p "Add log name: " custom_name
  INDEX=$((INDEX+1))
  LOGNAME="$(printf "%03d" $INDEX).$custom_name.log"
  echo now writing to $LOGNAME
}

trap switchlog INT
switchlog

while :
do
  read foo < p
  printf "%s\n" "$foo" >> "$LOGNAME"
done

次に、mkfifo pで名前付きパイプを作成し、monitor_program > preader.shが実行されている2つのターミナルを使用します。次に、リーダーを停止して、を使用して新しいログを設定できます。 Ctrl+C、新しい名前を入力します。 Ctrl+Z、いつものように、それを止めて殺します。

0
Treviño

あなたの「要求」についてもっと知らなければ、答えることは本当に不可能です。ファイルサイズまたは間隔に基づいている場合は、 rotatelogs (Apache httpdにバンドルされているはずです)が機能します。

0
symcbean