Shell脚本中的文件写缓冲

时间:2011-03-20 13:35:21

标签: linux shell

我有一个启动shell脚本,它从文件中读取一个值,将其递增1并将其写回。之后,我进行系统的电源循环(关闭并打开电源)。我试图用这种方式记录重启的次数。但我发现文件计数器始终保持为1.如果我使用reboot命令重新启动,则文件中的计数器会正确递增。这是因为内核缓冲并延迟了文件写入。有没有办法迫使它立即写出来?

rc.user文件如下:

cd /root
bash bootcounter.sh
sleep 1

bootcounter.sh如下

rebootcount=$(<bootcount)
rebootcount=$(($rebootcount+1))
echo $rebootcount >bootcount

...谢谢

4 个答案:

答案 0 :(得分:5)

您需要sync命令。这应该刷新所有文件系统。

count=$( cat bootcount )
echo $( expr $count + 1 ) > bootcount
sync

尽管如此,你应该使用完整的bootcount路径。

答案 1 :(得分:1)

在文件系统中同步文件操作没有简单而统一的答案 - 它们都是依赖于文件系统的。例如,事实上,可能没有强制写作,因为根本就没有写作 - 如果我们谈论的是纯粹的虚拟系统 - 或者可能存在多层写作,如果我们谈论的是某些网络 - 导出文件系统。

您可以尝试一些事项,但通常情况下,“您的里程可能会有所不同”:

  • 有一种常见的方法可以使文件系统永久保持一致状态 - umount。大多数Linux发行版在关机过程中卸载所有文件系统,并确保其干净且完全转储到硬件驱动器状态。
  • 如果umounting不是一个选项,可能至少可以将其重新安装为只读 - 它有效地执行与卸载相同的关闭过程,但保持文件系统可访问 - 类似于mount -o remount,ro /YOUR-FILE-SYSTEM
  • 如果无法做到这些,你可以尝试运行sync,但它有自己的故障:
    • sync调用只是对文件系统的建议,而不是严格的命令
    • sync调用可能会开始同步,但同步本身需要一些时间;没有办法知道同步完成的时间
    • 有时会添加像sleep 5之类的东西来睡5秒让光盘进行同步帮助
    • 有时人们使用像sync; sync; sync这样的解决方法,据报道也会以某种神秘的方式提供帮助
  • 您可能还想尝试清空缓存:echo 3 >/proc/sys/vm/drop_caches - 它还会强制转储应该写入的缓存,但它也需要时间,而且无法知道它是否已完成。有时所有方法的组合都有效,即:
sync; sync; sync
sleep 5
echo 3 >/proc/sys/vm/drop_caches

答案 2 :(得分:0)

尝试:

rebootcount=`expr $rebootcount + 1`
echo $rebootcount >bootcount

或更简单:

echo `expr $rebootcount + 1` >bootcount

答案 3 :(得分:0)

此信息已被跟踪!使用以下内容:

last reboot  

其中列出了自创建文件/var/log/wtmp以来所有以前的系统引导。此外,它还会告诉您服务器启动了多长时间,以及服务器启动和停机的时间。

看起来像这样:

reboot   system boot  2.6.35.10-74.fc1 Sun Jan  9 11:19 - 11:48  (00:28)    
reboot   system boot  2.6.35.10-74.fc1 Sun Jan  9 05:27 - 05:45  (00:17)    
reboot   system boot  2.6.35.10-74.fc1 Sat Jan  8 05:30 - 09:43  (04:12)

只是说。