2

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

该站点周围有许多类似的问题,但这个问题特别是关于 awk 和解决问题的务实、代码正确的方法。

编辑

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

4

2 回答 2

3

不,这不安全。

awkprint "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 个进程来写入同一个文件。正如我所说,使用>>,条目不会丢失(如果您的 awk 脚本工作正常)。但是我个人不会这样做。如果我必须有 4 个进程,我会写入不同的文件。嗯,我不知道你的要求,只是笼统地说。

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

于 2013-05-29T11:15:05.140 回答
1

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

于 2013-05-29T10:21:25.953 回答