linux - 需要建议在 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 编号编写的,这就是为什么它继续写在旧文件中的原因。
现在的问题是如何在不杀死/重启脚本的情况下避免空间问题?
解决方案
本质上,您要做的是从正在积极写入的脚本下拉出一个文件。我不知道怎么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.txt
和output1.txt_bkp
,你会看到前者看起来像这样:
1001
1002
1003
1004
...
2000000
而后者将有前 1000 行。你可以对你的日志做同样的事情。
提醒一句:根据您的描述,您的箱子因倾倒而承受着沉重的负担。这可能会对上述过程产生负面影响。
推荐阅读
- javascript - Leaflet:当标记聚集时关闭弹出窗口
- android - 为什么 Android 应用程序包文件名是使用像“apks/splits/base-arm64_v8a_2.apk”这样的数字后缀创建的?
- css - 控制数据表输出中的行条纹颜色
- elixir - 混合测试不插入数据?
- c++ - 如何将纹理应用于 OpenGL 中的子网格?
- javascript - Vue slot-props 没有被传递给子组件
- http - 使用 Wget 从网络请求中下载文件
- pdf - 如何在运行 Ghostscript 处理时保留 PDF 中未处理的页面?
- azure - 天蓝色。未找到订阅
- nginx - 路径的 Kubernetes 入口白名单 IP