Буферизация записи файла в скрипте Shell - PullRequest
1 голос
/ 20 марта 2011

У меня есть сценарий запуска оболочки, который читает значение из файла, увеличивает его на 1 и записывает обратно.После этого я делаю перезагрузку системы (выключаю и включаю питание).Я пытаюсь записать количество перезагрузок, используя этот способ.Но я обнаружил, что счетчик файлов всегда остается равным 1. Если я выполняю перезагрузку с помощью команды перезагрузки, счетчик в файле увеличивается должным образом.Это потому, что запись файла буферизируется и задерживается ядром.Есть ли способ заставить его писать немедленно?

Файл rc.user выглядит так:

cd /root
bash bootcounter.sh
sleep 1

bootcounter.sh выглядит следующим образом

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

Спасибо ...

Ответы [ 4 ]

5 голосов
/ 20 марта 2011

Вы хотите команду синхронизации. Это должно очистить все файловые системы.

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

Возможно, вам следует использовать полный путь к загрузочному счету.

1 голос
/ 21 марта 2011

Нет простого и унифицированного ответа для синхронизации файловой операции в файловой системе - все это очень зависит от файловой системы. Например, фактически, не может быть принудительной записи, поскольку вообще не может быть записи - если мы говорим о чисто виртуальной системе - или может быть несколько уровней записи, если мы говорим о какой-то сети - экспортированная файловая система.

Есть несколько вещей, которые вы можете попробовать, но, как правило, «ваш пробег может отличаться»:

  • Существует один распространенный способ обеспечения согласованности постоянного состояния файловой системы - umount it. Большинство дистрибутивов Linux размонтируют все файловые системы во время процесса выключения, и это обеспечивает их чистое и полностью загруженное в аппаратное состояние устройство.
  • Если вы не можете отключить монтирование, возможно, вы можете, по крайней мере, перемонтировать его только для чтения - он эффективно выполняет те же процедуры выключения, что и демонтирование, но оставляет файловую систему доступной - что-то вроде 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
0 голосов
/ 23 марта 2011

Эта информация уже отслеживается!Используйте следующее:

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)

Просто говорю.

0 голосов
/ 20 марта 2011

попробовать:

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

или более просто:

echo `expr $rebootcount + 1` >bootcount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...