我想知道如何使用 Linux 命令将文件(server.log)的所有内容复制到新文件并从原始文件中删除内容。其实很容易做到这一点。但我实际上想确保在该操作中不会有内容更新。按照 Linux 命令执行我想要的操作,但我必须确保在 command1-command2 执行之间 server.log 没有变化。
command1: #cp server.log serverNew.log
command2: #truncate -l 0 server.log
我想知道如何使用 Linux 命令将文件(server.log)的所有内容复制到新文件并从原始文件中删除内容。其实很容易做到这一点。但我实际上想确保在该操作中不会有内容更新。按照 Linux 命令执行我想要的操作,但我必须确保在 command1-command2 执行之间 server.log 没有变化。
command1: #cp server.log serverNew.log
command2: #truncate -l 0 server.log
我会使用专门为此目的构建的工具,而不是使用一些临时解决方案。
看看logrotate。您可以直接使用该命令,也可以在 cron 作业中进行设置。
它支持压缩,每次旋转后运行命令,根据大小或时间旋转等......
根据您在下面的评论,我假设您对这些选项感兴趣:
postrotate/endscript
postrotate
和之间的行endscript
(两者都必须单独出现在行上/bin/sh
)在日志文件轮换后执行(使用)。这些指令可能只出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。如果sharedscripts
指定,则将整个模式传递给脚本。另请参阅prerotate
。有关错误处理,请参见sharedscripts
和nosharedscripts
。
prerotate/endscript
prerotate
和之间的行endscript
(两者都必须单独出现在行上/bin/sh
)在日志文件旋转之前执行(使用),并且仅当日志实际旋转时才执行。这些指令可能只出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。如果sharedscripts
指定,则将整个模式传递给脚本。另请参阅postrotate
。有关错误处理,请参见sharedscripts
和nosharedscripts
。
这是一个简单的 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
不要复制,重命名(使用mv
)。重命名在文件系统级别是原子的,因此任何使用旧名称写入文件的应用程序都不会发生冲突。
之后,您可以使用touch命令来确保
command3: #touch server.log
您可以串联使用这些命令:cp oldFile newFile; cat '' >> oldFile
cp
复制您的文件。在第一个命令之后执行的第二个命令用于覆盖原始文件
显然,如果您将旧文件的内容复制到新文件中后将运行的“程序”(或脚本),则不需要以 write (而不是 write和 append)打开文件,第二个命令是不必要的。
此外,对于>>
重定向,您必须验证该noclobber
选项是否设置为“关闭”(1)