首页 > 解决方案 > 需要建议在 linux 中移动一个大的实时文件

问题描述

我的 Linux 服务器上正在运行多个脚本,这些脚本正在生成大量数据,我意识到它将在接下来的 2-5 天内吃掉我所有的 500GB 存储空间,而脚本需要 10 天以上才能完成该过程,这意味着它们需要更多空间。所以很可能我会遇到空间问题,我将不得不再次重新启动整个过程。过程是这样的 - script1.sh内容如下

"calling an api" > /tmp/output1.txt

script2.sh 内容如下

"calling an api" > /tmp/output2.txt

像这样执行 -

nohup ./script1.sh & ### this create file in  /tmp/output1.txt 
nohup ./script2.sh & ### this create file in  /tmp/output2.txt 

我最初的理解是,如果我按照以下步骤操作,它应该可以工作——当脚本在后台使用 nohup 运行时,执行这个命令——

mv /tmp/output1.txt /tmp/output1.txt_bkp; touch /tmp/output1.txt 

然后通过 ftp 将此文件传输/tmp/output1.txt_bkp到另一台服务器,然后将其删除以在服务器上获得空间,脚本将继续写入/tmp/output1.txt文件。

但是这个假设是错误的,脚本继续写入/tmp/output1.txt_bkp文件。我认为脚本是根据 inode 编号编写的,这就是为什么它继续写在旧文件中的原因。

现在的问题是如何在不杀死/重启脚本的情况下避免空间问题?

标签: linux

解决方案


本质上,您要做的是从正在积极写入的脚本下拉出一个文件。我不知道怎么nohup会让你这样做。

我可以建议一种不同的方法吗?

为什么不将 x 行从 your 移动/tmp/output[x].txt/tmp/output[x].txt_bkp?在脚本运行并将内容转储到/tmp/output[x].txt. 这样,您可以通过缩小output[x]文件来释放空间。

试试这个作为测试。打开 2 个终端(或使用screen)到您的 Linux 机器。确保两者都在同一个目录中。在您的一个终端中运行此命令:

for line in `seq 1 2000000`; do echo $line >> output1.txt; done

然后在第一个完成之前在另一个中运行此命令:

head -1000 output1.txt > output1.txt_bkp && sed -i '1,+999d' output1.txt

这是将要发生的事情。第一个命令将开始生成一个如下所示的文件:

1
2
3
...
2000000

第二个命令将切断前 1000 行output1.txt并将它们放入其中output1.txt_bkp,它会在生成文件时执行此操作。

之后,看里面output1.txtoutput1.txt_bkp,你会看到前者看起来像这样:

1001
1002
1003
1004
...
2000000

而后者将有前 1000 行。你可以对你的日志做同样的事情。

提醒一句:根据您的描述,您的箱子因倾倒而承受着沉重的负担。这可能会对上述过程产生负面影响。


推荐阅读