3

ファイル(server.log)のすべてのコンテンツを新しいファイルにコピーし、Linuxコマンドを使用して元のファイルからコンテンツを削除する方法を知りたいです。実際、それは簡単です。しかし、実際には、その操作内でコンテンツが更新されないことを確認したいと思います。次のLinuxコマンドは私が望むことを実行しますが、command1-command2の実行の間にserver.logに変更がないことを確認する必要があります。

command1: #cp server.log serverNew.log 
command2: #truncate -l 0 server.log
4

5 に答える 5

4

アドホックソリューションを使用する代わりに、この目的のために特別に構築されたツールを使用します。

logrotateを見てください。コマンドを直接使用することも、cronジョブで設定することもできます。

圧縮、各回転後のコマンドの実行、サイズや時間に基づいた回転などをサポートしています。

以下のコメントに基づいて、私はあなたがこれらのオプションに興味があると思います:

postrotate/endscript

postrotateとの間の行endscript(両方ともそれ自体で行に表示される必要があります)は/bin/sh、ログファイルがローテーションされた後に(を使用して)実行されます。これらのディレクティブは、ログファイル定義内にのみ表示される場合があります。通常、ログファイルへの絶対パスは、スクリプトの最初の引数として渡されます。指定するsharedscriptsと、パターン全体がスクリプトに渡されます。も参照してくださいprerotate。エラー処理についてはsharedscripts、およびを参照してください。nosharedscripts

prerotate/endscript

prerotateとの間の行endscript(両方とも単独で行に表示される必要があります)は/bin/sh、ログファイルがローテーションされる前に、ログが実際にローテーションされる場合にのみ(を使用して)実行されます。これらのディレクティブは、ログファイル定義内にのみ表示される場合があります。通常、ログファイルへの絶対パスは、スクリプトの最初の引数として渡されます。指定するsharedscriptsと、パターン全体がスクリプトに渡されます。も参照してくださいpostrotate。エラー処理についてはsharedscripts、およびを参照してください。nosharedscripts

于 2012-06-29T13:18:17.933 に答える
0

コピーせず、名前を変更します(を使用mv)。名前の変更はファイルシステムレベルでアトミックであるため、古い名前でファイルを書き込んでいるアプリケーションは衝突しません。

于 2012-06-29T13:06:55.950 に答える
0

その後、タッチコマンドを使用して確認することができます

command3: #touch server.log
于 2012-06-29T13:07:43.183 に答える
0

これらのコマンドを組み合わせて使用​​できcp oldFile newFile; cat '' >> oldFile
cpます。ファイルをコピーします。最初のコマンドの後に実行される2番目のコマンドは、元のファイルを上書きするために使用されます

明らかに、古いファイルの内容を新しいファイルにコピーすると実行される「プログラム」(またはスクリプト)の場合は、ファイルを書き込みで開きます(書き込みと追加ではありません)。2番目のコマンドは必要ありません。
さらに、リダイレクトの場合、オプションが「オフ」に設定され>>ていることを確認する必要があります(1)noclobber

于 2012-06-29T13:08:47.887 に答える
0

これは(おそらく)あなたが望むことをする単純なCアプリケーションです:

#include <stdlib.h>
#include <stdio.h>
#include <sys/file.h>

void main (int argc, char** argv)
{
    if (argc != 2)
        exit(1);

    FILE* fi = fopen(argv[1], "rb+");
    FILE* fo = fopen(argv[2], "wb");

    if (fi != NULL && fo != NULL && flock(fi, LOCK_EX) == 0)
    {
        while (feof(fi) == 0)
        {
            char* buf = malloc(4096);
            int bRead = 0;
            bRead = fread(buf, 1, 4096, fi);
            fwrite(buf, 1, bRead, fo);
        }

        frewind(fi);
        fputc(10, fi);

        flock(fi, LOCK_UN);
        fclose(fi);
        fclose(fo);
    }
else exit(1);

exit(0);
}

次のように呼び出します:./a.out oldfile newfile

警告:私は実際にこのコードをテストしていません。重要な作業にこれを使用する前に、必ずいくつかのテストを行ってください。

または、shell-toolを使用して何かを試すこともできます:http flock//linux.die.net/man/1/flock

于 2012-08-09T10:55:00.843 に答える