現在、監視ツールの出力をファイルにリダイレクトしていますが、このツールを停止せずに、(キーバインディングを使用して)要求に応じてこの出力を新しいファイルにリダイレクトします。
何かのようなもの
monitor_program | handle_stdout
どこでhandle_stdout
、ログを特定のポイントに配置する新しいファイルを定義できます。
私はそれを簡単に書くことができることを知っていますが、すでにこれを可能にするツールがあるかどうか疑問に思っています。
現在、監視ツールの出力をファイルにリダイレクトしていますが、このツールを停止せずに、(キーバインディングを使用して)要求に応じてこの出力を新しいファイルにリダイレクトします。
何かのようなもの
monitor_program | handle_stdout
どこでhandle_stdout
、ログを特定のポイントに配置する新しいファイルを定義できます。
私はそれを簡単に書くことができることを知っていますが、すでにこれを可能にするツールがあるかどうか疑問に思っています。
回答:
名前付きパイプをお勧めします。
パイプを作成するmkfifo p
( 'p'でない場合は、好きな名前を付けてください)
パイプから読み取り、好きな場所に書き込む「リーダー」スクリプトを作成する
監視プログラムにログを名前付きパイプに書き込むように指示する
名前付きパイプ「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
read
、printf
代わりにcat <p >> mylog."$INDEX"
?
ここでSIGQUIT(Ctrl+\)を使用してSIGINTのアイデアを構築し、まだ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が間違ったタイミングで(書き込みシステムコールで)配信され、一部のデータが失われる可能性があることに注意してください。
less
保存先sのファイル名を入力して、そこからを使用して、そこから保存することができますEnter。からlessからすべての行をファイルに書き込むにはどうすればよいですか?。
あなたの「リクエスト」についてもっと知らなければ、答えることは実際には不可能です。ファイルサイズまたは間隔に基づいている場合は、rotatelogs(Apache httpdにバンドルされているはず)が機能します。
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
ている2つのターミナルを使用します。次に、+ を使用してリーダーを停止し、新しいログを設定して、新しい名前を入力します。+ 通常どおり、停止して終了します。monitor_program > p
reader.sh
CtrlCCtrlZ
logrotate
、monitor_programの動作に応じて、手動でカスタム構成ファイルを使用して実行できますが、それはややハックです。