1

我有一个这样的脚本,

#!/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 中,我使用了 "$|" 并且在 C 中使用了“fflush”。不幸的是,它不起作用。

任何反馈表示赞赏...

4

2 回答 2

3

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

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

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

可以调用sync实用程序以确保在处理器停止之前已完成所有磁盘写入,而这种方式不适合由 shutdown(8) 完成。

于 2013-04-01T01:36:55.737 回答
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
于 2013-04-01T02:26:42.930 回答