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