回答:
これを試して:
truncate -s 0 /var/log/*log
編集:
これを複数回行いたい場合はlogrotate
、ログの処理に使用する必要があります。通常、ubuntuにインストールされます。をご覧man logrotate
ください(または、インストールされていない場合は、オンラインマンページをご覧になるか、でインストールしてくださいsudo apt-get install logrotate
)
マンページから:
logrotateは、大量のログファイルを生成するシステムの管理を容易にするように設計されています。ログファイルの自動ローテーション、圧縮、削除、およびメール送信が可能です。各ログファイルは、毎日、毎週、毎月、または大きくなりすぎたときに処理されます。
第1レベルのログフォルダーにあるものだけでなく、すべてのログファイルを消去する場合は、次のように使用できます。
shopt -s globstar # if needed
truncate -s 0 /var/log/*.log # first-level logs
truncate -s 0 /var/log/**/*.log # nested folders, like /var/log/nginx/access.log
既にlogrotate
実行している場合は、ローテーションされた.gz
ログも消去する必要があることに注意してください。
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
これの有効な使用法は、たとえば、配布用のVMアプライアンスコンテナの構築です。
定期的なメンテナンスの一環としてこれを行う必要はないはずです。DEMが非常に正しく提案しているようにlogrotate
、そのために使用してください。
一般的にほとんどのPOSIX準拠OSに適用される、ファイルを完全に切り捨てる方法がいくつかあります。シェルスクリプトで最もよく見られるのは、true > file.txt
またはのようなものです: > file.txt
(bash
シェルの場合、>
リダイレクトだけで十分です)。これは、フラグ付きまたはsyscall >
経由でファイルを開く方法が原因です。書き込み専用で読み取るか、ファイル名が存在しない場合は作成するか、既存のファイル名を切り捨てます。open()
openat()
O_WRONLY|O_CREAT|O_TRUNC
それを念頭に置いて、C自身でそのようなものを実装できます。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
このコードを保存するファイルにとして名前を付けてtrunc.c
でコンパイルするとgcc trunc.c -o trunc
、のように提供されるファイル名引数を切り捨てる小さなユーティリティがありますtrunc ./foobar.txt
。もちろん、このコードは他のチェックを行わず、最初の位置パラメーターのみを切り捨てます。複数の定位置パラメーターを処理する方法については、読者にお任せします。サイドノートではtruncate()
、同様に使用でき、ファイルを可変長に切り捨てるsyscall があります。
さて、あなたがCのファンでないなら、Pythonがあなたにとってより簡単かもしれません。open()
コマンドはPythonで同じ原理で動作します-ファイル名が存在する場合、書き込みおよび切り捨てのためにファイルを開きます。したがって、私たちはできる
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
すべての.log
ファイルの検索に関しては、すでに他の回答で説明されています-で*
globまたは拡張globを使用しbash
ます。またfind -type f -name "*.log"
、-exec
コマンドを実行するためのフラグがあります(この特定のケースでは、外部の実行可能ファイルではなく、シェル演算子sh -c ''
である>
ために利用し>
ます)。したがって、あなたはできる
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
また、ディレクトリ内のログファイルは/var/log
logrotateサービスによって頻繁にローテーションされるため、、などのファイル名があるため/var/log/service.log
、代わりにパターン/var/log/service.log.1
を使用することもできます。*.log.[1-9]
とりわけ/dev/null
、目的のファイルにコピーできます。奇妙なことに、/dev/null
特殊文字のデバイスタイプのファイルであっても、それを他の場所にコピーすると、少なくともGNUでは、結果は空の通常ファイルになりますcp
。したがって、私たちはできる
cp /dev/null foo.txt
または
dd if=/dev/null of=foo.txt
その他の推奨読書:
/ var / logs内のログをローテーションしてlogrotate機能でローテーションすることをお勧めしますが、いつでもしたいわけではありません。システムログが彼女に出力され、障害をデバッグするのに役立ちます。
logrotateを使用しないことが必要な場合は、オプションを検討できます。UNIXシステムのいくつかのフレーバーでは、truncateは簡単なオプションですが、このコマンドはすぐに使用できないため、インストールする必要があります。新しいコマンドをインストールできない場合は、以下のループを使用できます。
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
for logfile in /path/*.log
代わりに使用してください。
/var/log
はありません- 後で必要になるかもしれないメッセージをシステムが置く場所です。Ubuntuは以前に問題に遭遇しました。読んでくださいman 8 logrotate;man logrotate.conf
。