在Linux中原子读取和截断文件

时间:2019-06-08 09:19:18

标签: linux bash shell unix atomic

我正在创建一个进程调度程序,所有进程都像./program > out.txt一样启动。

在程序运行且产生输出的同时,我如何读取所有数据并自动截断文件,即确保在读取操作后不会在截断文件之前写入任何数据。

  • 我无法修改schedule命令或程序。但是,数据收集器知道数据生产者进程PID,并且允许数据收集器控制/暂停该过程。

  • 所有“读取所有数据”是指所有刷新的数据。如果我可以从外部强制冲洗管道,这将对您有所帮助,请编写,但是主要的问题是如何确保未冲洗/缓冲的管道数据在读取和截断操作之间永远不会被冲洗。

2 个答案:

答案 0 :(得分:2)

您可以使用

暂停并继续进行操作
kill -STOP $pid
kill -CONTINUE $pid

但是,我不认为kill -STOP $pid是同步的,因此您应该循环并等待直到过程更改状态(在/proc或通过ps中可用)。

此外,由于PID的回收,上述操作本质上是不合理的(您可能会遇到意外的过程),除非您以{pid}不会获得pid的方式从$pid的父级进行操作您完成了kill调用(交互式shell在SIGCHLD处理程序中自动获取pid)。

答案 1 :(得分:-1)

您可以尝试flock

在手册页中:

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile