web-dev-qa-db-ja.com

stdoutをファイルにリダイレクトし、別のタスクと同時に同じファイルから読み取る方法は?

Nohupを介してUbuntuLinux Bashでリモートでタスク(非常に長い時間がかかります)を実行し、stdoutをファイルにリダイレクトしたいと思います。例:

Nohup task > out.txt &

時々、出力ファイルを調べてタスクの進行状況を確認したいと思います。

cat out.txt

ファイルがBashによって書き込み用に開かれている限り、ファイルのコンテンツは空として表示されるため、その方法はまだわかりません。

だから私の質問は: '共有' stdoutリダイレクトを許可するLinuxコマンドはありますか?

5
Wildkeiler

ファイルがBashによる書き込み用に開かれている限り、ファイルの内容は空として表示されます。

それは正確には何が起こっているのかではありません。何が起こっているのかというと、タスク buffers その出力—しばらくの間メモリに蓄積されてから、チャンクでファイルに書き込まれます。インメモリバッファのサイズは数キロバイトに固定されています。各ファイルの書き込みには比較的高いオーバーヘッドがあるため、これはパフォーマンスのために行われます。したがって、最初はプログラムの出力は表示されませんが、少しずつ表示されます。これはbashとは何の関係もありません。

出力をすぐに確認したい場合は、 プログラムを開始するunbuffer (from expect =ソフトウェアパッケージ)。あなたはパフォーマンスを即時性と交換します。

2番目の問題は、catがすでに出力された出力を表示し、ファイルの終わりに達するとすぐに終了することです。追加されたときに出力を読み続けたい場合は、 tail のフォローモードを使用します。

Nohup unbuffer task >out.txt &
tail -n +1 -f out.txt

押す Ctrl+Ctailを終了します。 tailの代わりに、lessとそのフォローモードを使用できます(Fを押します。 Ctrl+C 読むのをやめる)。

teeコマンドを見てください。 ここ はそのいくつかの例です。

次のコマンド(teeコマンドを使用)は、出力を画面(stdout)とファイルの両方に書き込みます。

$ ls | tee file
2
fduff