繁体   English   中英

Shell脚本中的文件写缓冲

[英]File write buffering in Shell script

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

rc.user文件如下:

cd /root
bash bootcounter.sh
sleep 1

bootcounter.sh如下

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

谢谢...

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

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

但是,您可能应该使用完整路径进行引导计数。

在文件系统中同步文件操作并没有简单统一的答案-这完全取决于文件系统。 例如,实际上,可能没有强制编写,因为根本没有编写-如果我们在谈论纯虚拟系统-或有多层编写,如果我们在谈论某种网络-导出的文件系统。

您可以尝试以下几种方法,但总的来说,“您的里程可能会有所不同”:

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

尝试:

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

或更简单地说:

echo `expr $rebootcount + 1` >bootcount

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

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)

只是说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM