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

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

私は現在監視ツールの出力をファイルにリダイレクトしていますが、私が望むのは、そのツールを停止せずに私の要求に応じて(キーバインディングを使用)、この出力を新しいファイルにリダイレクトすることです。

それはまるで

monitor_program | handle_stdout

Whereをhandle_stdout使用すると、特定の場所にログを配置する新しいファイルを定義できます。

簡単に書くことができることを知っていますが、すでにこれを可能にするツールがあるかどうか疑問に思います。

答え1

私は名前付きパイプを提案したいと思います。

  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

答え2

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も間違った時間(書き込みシステム呼び出しで)に渡され、一部のデータが失われる可能性があります。

答え3

保存したいファイル名をless入力してから.fromと入力します。sEnterlessのすべての行をファイルに書き込むには?

答え4

ありがとうジェフ・シャラーの答え、私は基本的に私が必要なことを行う次のように終わりました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実行する2つの端末を使用します。その後、読者が+を使用して新しい投稿を設定するのを防ぎ、新しい名前を入力できます。 +その後、いつものように停止して終了します。monitor_program > preader.shCtrlCCtrlZ

関連情報