在shell脚本中立即写入文件(没有行缓冲)

时间:2013-04-01 01:31:05

标签: linux shell

我有一个这样的脚本,

#!/bin/bash

echo "hello" > a.txt

while [ True ]; do

#do something here, very long and possiblely causing system reboot

done

如果执行正常结束,我看起来只能获得正常的a.txt(内置“hello”)。如果“while循环”正在运行或者在while循环期间触发了系统重新启动,则会有一个空白的a.txt。

通过谷歌搜索,它似乎是一个行缓冲问题,因为shell默认启用行缓冲区。由于我的自定义Ubuntu上没有安装“Expect”或“stdbuf”,我试图替换

echo "hello" > a.txt

使用Perl / C程序,禁用行缓冲区。在Perl中,我使用了“$ |”和“fflush”在C中使用。不幸的是,它不起作用。

感谢任何反馈......

2 个答案:

答案 0 :(得分:3)

这不完全正确。在回显之后,文件将被写入并对其他程序可见。这是有保证的。

您可能会看到此时文件未写入物理磁盘。这可能是由于操作系统的文件系统缓冲所致。仅仅因为文件已被写入并且其他程序看到它并不意味着它已被写入磁盘。它可能只是在记忆中。

您可以请求操作系统使用" sync"来刷新所有缓冲的写入磁盘。命令。尝试在触发重启之前调用它,看看是否能解决问题。

  

可以调用同步实用程序,以确保在处理器暂停之前已完成所有磁盘写入,其方式不是由shutdown(8)完成。

答案 1 :(得分:2)

尝试它是否有效:

#!/bin/bash
echo "hello"|awk '{print;fflush()}' > a.txt
sync
while [ True ]; do
#do something here, very long and possiblely causing system reboot
done