次のコマンドを使用して、crontab によって毎日呼び出される小さなスクリプトがあります。
/homedir/MyScript &> some_log.log
この方法の問題は、some_log.log が MyScript の終了後にしか作成されないことです。プログラムの実行中にプログラムの出力をファイルにフラッシュしたいので、次のようなことができます
tail -f some_log.log
進行状況などを追跡します。
script -c <PROGRAM> -f OUTPUT.txt
キーは -f です。manスクリプトからの引用:
-f, --flush
Flush output after each write. This is nice for telecooperation: one person
does 'mkfifo foo; script -f foo', and another can supervise real-time what is
being done using 'cat foo'.
バックグラウンドで実行:
nohup script -c <PROGRAM> -f OUTPUT.txt
bash自体が実際にログファイルに出力を書き込むことはありません。代わりに、スクリプトの一部として呼び出すコマンドは、それぞれ個別に出力を書き込み、必要に応じてフラッシュします。したがって、あなたの質問は、bashスクリプト内のコマンドを強制的にフラッシュする方法であり、それはそれらが何であるかによって異なります。
tee
フラッシュを必要とせずにファイルに書き込むために使用できます。
/homedir/MyScript 2>&1 | tee some_log.log > /dev/null
これはの機能ではありませんbash
。シェルが行うのは、問題のファイルを開いてから、スクリプトの標準出力としてファイル記述子を渡すことだけです。あなたがする必要があるのは、あなたが現在よりも頻繁にスクリプトから出力がフラッシュされることを確認することです。
たとえば、Perlでは、これは次のように設定することで実現できます。
$| = 1;
詳細については、 perlvarを参照してください。
これは役に立ちますか?
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
これにより、 stdbufユーティリティを使用してaccess.logからの一意のエントリがすぐに表示されます。
出力のバッファリングは、プログラムの/homedir/MyScript
実装方法によって異なります。出力がバッファリングされていることがわかった場合は、実装でそれを強制する必要があります。たとえば、python プログラムの場合は sys.stdout.flush() を使用し、C プログラムの場合は fflush(stdout) を使用します。
を使用した Mac OS X のバックグラウンド プロセスでこの問題が発生しましたStartupItems
。これが私がそれを解決する方法です:
私が作ると、それが起動されsudo ps aux
ていることがわかりmytool
ます。
(バッファリングのため) Mac OS X のシャットダウン時に出力がコマンドmytool
に転送されないことがわかりました。sed
ただし、 を実行すると、出力がコマンドに転送されsudo killall mytool
ます。したがって、Mac OS X のシャットダウン時に実行されるケースを追加しました。mytool
sed
stop
StartupItems
start)
if [ -x /sw/sbin/mytool ]; then
# run the daemon
ConsoleMessage "Starting mytool"
(mytool | sed .... >> myfile.txt) &
fi
;;
stop)
ConsoleMessage "Killing mytool"
killall mytool
;;
それがうまくいくかどうかはわかりませんが、電話するのはsync
どうですか?
好むと好まざるとにかかわらず、これがリダイレクトのしくみです。
あなたの場合、スクリプトの出力(スクリプトが終了したことを意味します)がそのファイルにリダイレクトされました。
あなたがしたいことは、それらのリダイレクトをスクリプトに追加することです。