シェルからリダイレクトログファイルの内容を消去するには?

シェルからリダイレクトログファイルの内容を消去するには?

リダイレクトを使用して、ジョブprintln出力をxxx.logファイルに書き込みます。しかし、ログ情報をcrontabを介して現在の日付名を持つ別のファイルに移動したいと思います2017-08-18.log

> xxx.logシェルコマンドを使用してファイルを消去しようとしましたが、xxx.log新しいログが作成されるとすべてが復元されます。

リダイレクトログファイルを消去する方法は?

修正する

  1. 実行後の> xxx.logファイルxxx.logサイズは0です。しかし、私のアプリケーションがいくつかの新しいログを印刷すると、新しいxxx.logログ情報だけでなく、以前に消去されたログ情報も含まれます。
  2. 使用後はmv xxx.log xxx2.log新しいログ情報が記録されますxxx2.log。ただし、名前変更の代わりに使用すると、rm xxx.logログ操作は停止します。またnohup java -jar xxx.jar > xxx.log 2>&1 &、おなじみの場合は、次の手順に従ってください。ゲームフレームワーク、ファイルビルドを実行すると、distコマンドによってjarファイルが生成されます。
  3. ps wx|grep "xxx.*.log出力:
    1) 3912 pts/10 S+ 0:00 grep --color=auto xxx.log
    2) 26234 pts/10 Sl 0:16 /usr/lib/jvm/jdk1.8.0_111/bin/java -Duser.dir=...something ignored... play.core.server.ProdServerStart(プロセス実行命令)

お役に立てば幸いです。もう一度ありがとうございます!

答え1

問題は、ログファイルを作成するアプリケーションによってログファイルが開いていることです。ファイル()を切り捨てると、> file.logアプリケーションは最後に作成された場所から書き込みを続けます(切り捨てのため、以前はファイルがゼロバイトで埋められると仮定します)。ファイルを移動すると、ファイルが開かれると名前は重要ではなくなり、アプリケーションはファイルに書き込みを続けます。ファイルを削除すると、そのブロックはディスクから解放されず、ファイルがディレクトリに表示されなくなった場合でも、アプリケーションはブロックに書き込みを続けます。

これは古典的なシーンです。あなたの申請書は以下を満たす必要があります。

  • 定期的にログファイルを再度開く
  • または、切り捨てを検出して再度開きます。
  • または、「現在のログファイルを閉じて再度開く」という特別なシグナルを待ちます。

そうしないと、アプリケーションを再起動する以外に外部で何もできません。その後、次のように進みますlogrotate

  • まず、ログファイルを新しい名前に移動します。
  • オプションで、touchログファイルの古い名前を使用してファイルが存在するようにします。
  • 古いログファイルの書き込みを強制的に停止し、新しいログファイルの書き込みを開始するには、アプリケーションを再起動します。

答え2

Perlに精通している場合は、次の小さなスクリプトを実行できます。

use POSIX qw(strftime);

$fbase = "tmp-%Y-%m-%d-%H-%M.log";

while(<>)
{
  $fnamenew = strftime $fbase, localtime;

  if ($fnamenew ne $fname)
  {
    print "logging to: $fnamenew\n";
    $fname = $fnamenew;
    close OUT;
    open OUT, ">$fname";
  }
  print OUT $_;
}

次のように使用してください$mycomputation | perl script.pl。与えられた時間パターンに従って作成されたファイル名にすべての入力を追加します(ここでは)tmp-YYYY-MM-DD-HH-MI.log。新しい入力行ごとにスキーマが書き換えられ、古いスキーマと比較して検証されます。それ以外の場合、入力は新しいファイルにパイプされ、古いファイルは閉じられます。

関連情報