使用>>将几个并行进程的输出传输到一个文件是否安全?

con*_*lee 37 unix parallel-processing concurrency pipe

我正在从网上抓取数据,并且我有几个并行运行刮刀的过程.

我希望每个进程的输出最终都在同一个文件中.只要文本行保持完整并且不会相互混淆,行的顺序无关紧要.在UNIX中,我可以使用>>运算符将每个进程的输出管道传输到同一个文件吗?

Mar*_*ers 28

不可以.不能保证线路保持完整.它们可以混合在一起.

根据liori的回答搜索,我发现了这个:

{PIPE_BUF}字节或更少字节的写请求不应与来自在同一管道上执行写操作的其他进程的数据交错.无论是否设置了文件状态标志的O_NONBLOCK标志,大于{PIPE_BUF}字节的写入都可以在任意边界上与其他进程进行写入交错.

因此,不保证长于{PIPE_BUF}字节的行保持​​不变.

  • 为了清楚起见-这种情况仅适用于管道,包括命名管道(又名FIFO文件)。它不适用于其他类型的文件,在这种情况下,可能无法保证不会混合写入。 (2认同)

rai*_*inz 12

你可以做的一个有趣的事情是使用gnu parallel:http://www.gnu.org/s/parallel/例如,如果你是蜘蛛网站:

stackoverflow.com, stackexchange.com, fogcreek.com 
Run Code Online (Sandbox Code Playgroud)

你可以做这样的事情

(echo stackoverflow.com; echo stackexchange.com; echo fogcreek.com) | parallel -k your_spider_script
Run Code Online (Sandbox Code Playgroud)

并且输出是并行缓冲的,因为-k选项按照上面站点列表的顺序返回给你.一个真实的例子(基本上是从第二个并行截屏视频复制的):

 ~ $ (echo stackoverflow.com; echo stackexchange.com; echo fogcreek.com) | parallel -k ping -c 1 {}


PING stackoverflow.com (64.34.119.12): 56 data bytes

--- stackoverflow.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING stackexchange.com (64.34.119.12): 56 data bytes

--- stackexchange.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING fogcreek.com (64.34.80.170): 56 data bytes
64 bytes from 64.34.80.170: icmp_seq=0 ttl=250 time=23.961 ms

--- fogcreek.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 23.961/23.961/23.961/0.000 ms
Run Code Online (Sandbox Code Playgroud)

无论如何,ymmv


lio*_*ori 7

一般来说,没有.

在Linux上,这可能是可能的,只要满足两个条件:每行写入一个操作,并且该行不长于PIPE_SIZE(通常与PAGE_SIZE相同,通常为4096).但是......我不会指望那个; 这种行为可能会改变.

最好使用某种真实的日志记录机制,比如syslog.


Bol*_*ter 5

绝对不,我有一个日志管理脚本,我认为它可以工作,并且它确实工作,直到我将其移至负载不足的生产服务器。这不是美好的一天……但基本上,有时你会得到完全混乱的台词。

如果我尝试从多个源捕获,那么拥有多个文件“纸质轨迹”会更简单(并且更容易调试),并且如果我需要一个整体日志文件,请根据时间戳连接(您正在使用时间-邮票,对吧?)或者正如 liori 所说,系统日志。