从多个进程awk写入同一文件的正确方法

时间:2013-05-29 10:02:09

标签: awk parallel-processing

标题说明了一切。 我有4个awk进程记录到同一个文件,输出似乎很好,没有损坏,但我不确定只是重定向print输出如下:print "xxx" >> file在每个进程中是正确的方法做到这一点。

网站上有许多类似的问题,但这个问题特别关注awk以及解决问题的实用,代码正确的方法。

修改

对不起朋友们,我当然不是像我写的那样“只是重定向”,而是在追加。

2 个答案:

答案 0 :(得分:3)

不,这不安全。

awk print "foo" > "file"将打开文件并覆盖文件内容,直到脚本结束。

也就是说,如果您的4个awk进程在不同时间开始写入同一个文件,它们会覆盖彼此的结果。

要重现它,你可以像这样开始两个(或更多)awk:

awk '{while(++i<9){system("sleep 2");print "p1">"file"}}' <<<"" &
awk '{while(++i<9){system("sleep 2");print "p2">"file"}}' <<<"" &

同时你监控file的内容,你会看到最后没有8“p1”和8“p2”。

使用>>可以避免丢失条目。但是来自4个进程的输入序列可能会混乱。

修改

好的,>是一个错字。

我不知道为什么你真的需要4个进程写入同一个文件。正如我所说,使用>>,条目不会丢失(如果你的脚本工作正常)。但就我个人而言,我不会这样做。如果我必须有4个进程,我会写入不同的文件。好吧,我不知道你的要求,只是说一般。

输出到不同的文件使测试,调试更容易。想象当你的一个进程出现问题时,你想要解决它。等...

答案 1 :(得分:1)

我认为使用操作系统打印命令是保存。事实上,这将使用您提供的字符串作为日志附加文件写入缓冲区。因此,系统将管理数据到盘的实际写入过程,如果另一个进程想要使用相同的文件,系统将看到该资源已被声明并将等待第一个线程完成其处理,而不是允许写入缓冲区的第二个进程。