将标准输出重定向到文件显示错误的内容

2024-04-27 13:39:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“timer\u fifo”的管道,python脚本的stdout被重定向到timer\u fifo,而并行的另一个shell脚本进程从中读取、处理它,然后将它重定向到另一个名为“activity\u file”的文件。你知道吗

Python脚本:

import time
while True:
    print(time.strftime('%Y_%m_%d', time.gmtime()))
    time.sleep(1)

执行上述python脚本:

python above_file_name > timer_fifo

Shell脚本:

while true
do
    read action <timer_fifo;
    echo $action | stdbuf -o0 -e0 -i0 sed -n "s/^\([^[:space:]].*\)/\1 Cinnamon/p" >> activity_file
done

注意:上面的sed命令附加了“cingalon”并重定向到活动文件,因此如果输入是“2017\u 02\u 01”,那么它将变为“2017\u 02\u 01 cingalon”,如果输入流以空格开头,它也会忽略输入流。你知道吗

正在执行上面的shell脚本:

./file_name

一段时间以来,文件的尾部:

2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon

但过了一会儿,文件的尾部:

2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
017_02_01 Cinnamon
207_20 Cinnamon
270_1 Cinnamon
210_101_2001_20 Cinnamon
2017_02_0 Cinnamon
270_11207_02_01 Cinnamon
107_20 Cinnamon
0020 Cinnamon

如您所见,为什么输出会出错? 另外,我可能不止一次执行上述脚本,那么多个进程同时写入同一个文件会导致排序输出吗?如果是,请解释原因?你知道吗


Tags: 文件name脚本time进程actionactivityshell
1条回答
网友
1楼 · 发布于 2024-04-27 13:39:03

如果只运行程序的一个副本,那么所有内容都会按顺序到达fifo,缓冲不会影响排序。你知道吗

如果您正在运行多个程序副本,并且每个副本都在执行自己的标准输出缓冲,那么您可能会得到部分行。你知道吗

我想这就是你看到的。你知道吗

我认为这种情况下(不完美的)解决方案是在python脚本的print()sleep()之间添加一行代码,如下所示:

sys.stdout.flush()

这将使得整条线路很可能在每次print()/flush()被调用时,以单个、不间断的系统调用写入fifo。它仍然不能确定你是否得到原子性的保证。但实际上,像这样的短字符串将作为单个系统调用。你知道吗

(您也可以尝试更改sys.stdout的缓冲区,或者使用python的运行时标志,但我认为如上所述调用flush()是最好的方法。)

fromsys.stdout docs:当交互时,标准流是行缓冲的。否则,它们像普通文本文件一样被块缓冲。你知道吗

相关问题 更多 >