tee -a не воссоздает файл

Я запускаю следующую команду в последней версии Raspberry Pi 3 Debian:

cat /dev/ttyUSB0 | tee -a /media/pi/KINGSTON/klima.out | grep -F $ | tee -a /media/pi/KINGSTON/log 

Команда отлично работает и делает то, что нужно; однако, когда я удаляю (вручную или CRON) файл klima.out , он не воссоздается. Команда продолжает работать, файл журнала продолжает klima.out , но файл klima.out не возвращается. (также нет буферизации). Я хочу удалить его раз в неделю, чтобы не позволить ему расти по всем границам. Какие-либо предложения?

3 Solutions collect form web for “tee -a не воссоздает файл”

Если вы хотите восстановить блоки файлов, вам нужно очистить файл, а не отменить его:

Этот переносной способ должен работать с большинством оболочек:

 : > /media/pi/KINGSTON/klima.out 

Отвязывание файла (т. Е. Rm) удаляет запись каталога, но не влияет на содержимое файла (inode), если файл хранится читателями или писателями.

Я предполагаю, что ваш конвейер работает в течение длительного времени и что вы пытаетесь удалить файл журнала во время его работы.

Когда вы удаляете файл, процесс tee все еще открыт для записи, что означает, что дисковое пространство не возвращается системе. Это произойдет не до тех пор, пока не будут закрыты все дескрипторы открытых файлов, которые ссылаются на файл.

Вполне нормально записывать файл, который был удален, до тех пор, пока дескриптор файла был выделен до удаления.

Вам нужно будет перезапустить конвейер для файла, который будет воссоздан, и позволить освободить место, занятое старым (теперь безымянным) файлом журнала.

Чтобы избежать необходимости перезапуска конвейера, вы можете обрезать файл, то есть отрегулировать его размер до нуля, не удаляя его. Это позволило бы tee продолжить добавление к файлу без повторного его открытия.

Усечение файла может быть выполнено, как показано в jlliagre в его ответе , или с помощью truncate (нестандартной утилиты, которая является частью GNU coreutils):

 truncate -s 0 /media/pi/KINGSTON/klima.out 

Для получения дополнительной информации об этой утилите см. Руководство для truncate .

Вы не понимаете, как система обрабатывает файлы.

Вы удаляете запись файла, но файл все еще существует, пока программа держит дескриптор на нем. Поэтому tee никогда не уведомляется о том, что запись была удалена, и она все еще записывает файл!

Уникальный файл может иметь много записей благодаря жестким ссылкам (созданным командой ln).

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

Вот функция-оболочка, которая будет разделять ее входные данные на несколько файлов:

 splitSizeInKio=100 splitInput(){ local PS4='+splitInput+ ' set -x local i=0 local fname="$1" local ii while true do if [ $i -lt 10 ] then ii=0$i else ii=$i fi local outfile="$fname".$ii dd of="$outfile" bs=1024 count=$splitSizeInKio i=$((i+1)) done } 

(Вы можете использовать «head» вместо «dd», если вы пролили несколько строк вместо размера.)

С помощью bash вы можете использовать «замещение процесса» следующим образом:

 prog1 | tee >( splitInput somefilename ) | prog2 
  • Bash: Объем переменных в цикле for с использованием тройника
  • Как использовать тройник для перенаправления на grep
  • Как использовать команду tee с эхом в соответствии с требованиями ниже?
  • Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»
  • Как написать файл с netcat? И установите, чтобы он вырос до определенного размера и начал переписывать себя?
  • конфликт кэша паролей tee / sudo?
  • Как заставить mplayer играть с stdin?
  • значение переменной оболочки для цикла, отличного от цикла
  • Возможно ли «разблокировать» STDOUT в двух разных местах?
  • grep ключевое слово из вывода Mplayer и отправить остальное в файл
  • Как я могу удалить файл защиты, сделанный tee?
  • Interesting Posts

    PHP-скрипт не может читать аргументы CLI, когда дополнительные расширения включены в php.ini

    Как преобразовать tar-файл из формата gnu в формат pax

    Не удается смонтировать RAID после обновления

    Почему я не вижу некоторые файлы на своем USB-накопителе в Windows, которые я могу увидеть в Linux?

    SUDO_USER undefined в руководстве sudo – разъяснение будет прекрасным

    Замещать несколько форматов звукового файла без дефляции

    Скопируйте только данные файла (имя файла, размер, время) с удаленного компьютера в unix

    Как автоматически запускать контейнер lxc в ssh-соединении?

    ksh – вычесть 5 минут из текущего времени

    Как настроить «максимальные открытые файлы» и жесткий лимит для определенного процесса?

    alias Невозможно выполнить команду источника

    Как выполнить следующую команду во время выполнения предыдущего?

    Понимание размера блока ввода-вывода

    Как создать все Debian

    Ошибка при установке общей папки для гостевой системы KVM Solaris

    Linux и Unix - лучшая ОС в мире.