102

次のコマンドを使用して、crontab によって毎日呼び出される小さなスクリプトがあります。

/homedir/MyScript &> some_log.log

この方法の問題は、some_log.log が MyScript の終了後にしか作成されないことです。プログラムの実行中にプログラムの出力をファイルにフラッシュしたいので、次のようなことができます

tail -f some_log.log

進行状況などを追跡します。

4

13 に答える 13

36
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
于 2014-01-31T18:59:28.643 に答える
31

bash自体が実際にログファイルに出力を書き込むことはありません。代わりに、スクリプトの一部として呼び出すコマンドは、それぞれ個別に出力を書き込み、必要に応じてフラッシュします。したがって、あなたの質問は、bashスクリプト内のコマンドを強制的にフラッシュする方法であり、それはそれらが何であるかによって異なります。

于 2009-09-15T22:33:40.593 に答える
8

teeフラッシュを必要とせずにファイルに書き込むために使用できます。

/homedir/MyScript 2>&1 | tee some_log.log > /dev/null
于 2013-04-13T10:41:48.080 に答える
3

これはの機能ではありませんbash。シェルが行うのは、問題のファイルを開いてから、スクリプトの標準出力としてファイル記述子を渡すことだけです。あなたがする必要があるのは、あなたが現在よりも頻繁にスクリプトから出力がフラッシュされることを確認することです。

たとえば、Perlでは、これは次のように設定することで実現できます。

$| = 1;

詳細については、 perlvarを参照してください。

于 2009-09-15T22:32:15.627 に答える
3

これは役に立ちますか?

tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq 

これにより、 stdbufユーティリティを使用してaccess.logからの一意のエントリがすぐに表示されます。

于 2010-12-23T17:18:51.933 に答える
2

出力のバッファリングは、プログラムの/homedir/MyScript実装方法によって異なります。出力がバッファリングされていることがわかった場合は、実装でそれを強制する必要があります。たとえば、python プログラムの場合は sys.stdout.flush() を使用し、C プログラムの場合は fflush(stdout) を使用します。

于 2017-04-09T13:21:23.237 に答える
-2

を使用した Mac OS X のバックグラウンド プロセスでこの問題が発生しましたStartupItems。これが私がそれを解決する方法です:

私が作ると、それが起動されsudo ps auxていることがわかりmytoolます。

(バッファリングのため) Mac OS X のシャットダウン時に出力がコマンドmytoolに転送されないことがわかりました。sedただし、 を実行すると、出力がコマンドに転送されsudo killall mytoolます。したがって、Mac OS X のシャットダウン時に実行されるケースを追加しました。mytoolsedstopStartupItems

start)
    if [ -x /sw/sbin/mytool ]; then
      # run the daemon
      ConsoleMessage "Starting mytool"
      (mytool | sed .... >> myfile.txt) & 
    fi
    ;;
stop)
    ConsoleMessage "Killing mytool"
    killall mytool
    ;;
于 2010-05-29T20:41:39.353 に答える
-4

それがうまくいくかどうかはわかりませんが、電話するのはsyncどうですか?

于 2009-09-15T22:41:46.527 に答える
-4

好むと好まざるとにかかわらず、これがリダイレクトのしくみです。

あなたの場合、スクリプトの出力(スクリプトが終了したことを意味します)がそのファイルにリダイレクトされました。

あなたがしたいことは、それらのリダイレクトをスクリプトに追加することです。

于 2009-09-15T22:48:17.730 に答える