如何截断正在写入的文件

如何截断正在写入的文件

我在远程计算机上有一个长时间运行的进程,我是这样启动的:

$ nohup ./process > output &

我的问题是输出文件越来越大。当然,这个文件对我的唯一用途就是监控进程:

$ tail -f ./output

因此,我想不时截断文件以节省空间(我担心我可能会用完空间)。所以我尝试了这个:

$ truncate -s 0 output

但似乎由于文件已打开并正在写入,此命令无效。作为测试,我曾经删除过文件,但之后却没有创建新文件。所以我丢失了进度报告,不得不重新开始该过程。

有什么方法可以在写入文件时截断文件吗?

答案1

虽然全尺寸解决方案可能涉及logrotate,但根据以下演示示例,它可能与更简单的解决方案一起使用。

我启动了一个进程#1,将当前日期和时间写入文件output

while true;do LC_TIME=en_US date>>output;sleep 10;done &

然后我启动了一个进程 #2,它复制output,并使用 tail 将重定向的副本截断回output。这会使进程 #1 的写入保持活动状态。它也可能适用于您的情况。

while true;do cat output > ttt;tail ttt > output;cat output;echo '----------------------------';sleep 60;done &

进程 #2 的输出示例,

Sun Nov 25 14:31:40 CET 2018
----------------------------
Sun Nov 25 14:31:10 CET 2018
Sun Nov 25 14:31:20 CET 2018
Sun Nov 25 14:31:30 CET 2018
Sun Nov 25 14:31:40 CET 2018
Sun Nov 25 14:31:50 CET 2018
Sun Nov 25 14:32:00 CET 2018
Sun Nov 25 14:32:10 CET 2018
Sun Nov 25 14:32:20 CET 2018
Sun Nov 25 14:32:30 CET 2018
Sun Nov 25 14:32:40 CET 2018
----------------------------
Sun Nov 25 14:32:10 CET 2018
Sun Nov 25 14:32:20 CET 2018
Sun Nov 25 14:32:30 CET 2018
Sun Nov 25 14:32:40 CET 2018
Sun Nov 25 14:32:50 CET 2018
Sun Nov 25 14:33:00 CET 2018
Sun Nov 25 14:33:10 CET 2018
Sun Nov 25 14:33:20 CET 2018
Sun Nov 25 14:33:30 CET 2018
Sun Nov 25 14:33:40 CET 2018
----------------------------

我还测试了如何制作一个不会挂断的演示示例,如果窗口/连接关闭,

nohup bash -c 'while true;do LC_TIME=en_US date>>output;sleep 10;done' &

nohup bash -c 'while true;do cat output > ttt;tail ttt > output;sleep 60;done' &

可以LANG=C tail -f ./output从另一个窗口/连接进行监控,

Sun Nov 25 15:01:05 CET 2018
Sun Nov 25 15:01:15 CET 2018
Sun Nov 25 15:01:25 CET 2018
Sun Nov 25 15:01:35 CET 2018
Sun Nov 25 15:01:45 CET 2018
Sun Nov 25 15:01:55 CET 2018
Sun Nov 25 15:02:05 CET 2018
tail: ./output: file truncated
Sun Nov 25 15:00:35 CET 2018
Sun Nov 25 15:00:45 CET 2018
Sun Nov 25 15:00:55 CET 2018
Sun Nov 25 15:01:05 CET 2018
Sun Nov 25 15:01:15 CET 2018
Sun Nov 25 15:01:25 CET 2018
Sun Nov 25 15:01:35 CET 2018
Sun Nov 25 15:01:45 CET 2018
Sun Nov 25 15:01:55 CET 2018
Sun Nov 25 15:02:05 CET 2018
Sun Nov 25 15:02:15 CET 2018
Sun Nov 25 15:02:25 CET 2018
Sun Nov 25 15:02:35 CET 2018
Sun Nov 25 15:02:45 CET 2018

相关内容