3

我想知道如何使用 Linux 命令将文件(server.log)的所有内容复制到新文件并从原始文件中删除内容。其实很容易做到这一点。但我实际上想确保在该操作中不会有内容更新。按照 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。有关错误处理,请参见sharedscriptsnosharedscripts

prerotate/endscript

prerotate和之间的行endscript(两者都必须单独出现在行上/bin/sh)在日志文件旋转之前执行(使用),并且仅当日志实际旋转时才执行。这些指令可能只出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。如果sharedscripts指定,则将整个模式传递给脚本。另请参阅postrotate。有关错误处理,请参见sharedscriptsnosharedscripts

于 2012-06-29T13:18:17.933 回答
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 flock: http: //linux.die.net/man/1/flock

于 2012-08-09T10:55:00.843 回答
0

不要复制,重命名(使用mv)。重命名在文件系统级别是原子的,因此任何使用旧名称写入文件的应用程序都不会发生冲突。

于 2012-06-29T13:06:55.950 回答
0

之后,您可以使用touch命令来确保

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

您可以串联使用这些命令:cp oldFile newFile; cat '' >> oldFile
cp复制您的文件。在第一个命令之后执行的第二个命令用于覆盖原始文件

显然,如果您将旧文件的内容复制到新文件中后将运行的“程序”(或脚本),则不需要以 write (而不是 write和 append)打开文件,第二个命令是不必要的。
此外,对于>>重定向,您必须验证该noclobber选项是否设置为“关闭”(1)

于 2012-06-29T13:08:47.887 回答