[英]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.