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 
  • Список содержимого каталога перенаправляется в файл с помощью tee
  • Как написать файл с netcat? И установите, чтобы он вырос до определенного размера и начал переписывать себя?
  • Как создать реальную копию дескриптора файла stdout и stderr без использования unbuffer / script / tee только с встроенными встроенными в bash?
  • Перенаправить вывод сценария в / dev / tty1, а также отобразить вывод в файл
  • Как перенаправить вывод команды «xterm -hold -e»
  • Как я могу перенаправить соответствующие строки в файл, а не совпадающие строки с другим файлом?
  • Различные стили перенаправления с netcat и tee дают разные результаты
  • Как работает `: w! Sudo tee%`
  • Как использовать команду tee с эхом в соответствии с требованиями ниже?
  • Bash: Объем переменных в цикле for с использованием тройника
  • Замена процесса тройником и пастой
  • Interesting Posts

    Как использовать управление bash на клавиатуре

    Ожидание долго (несколько минут) во время загрузки для cryptsetup для запроса пароля

    Информация просачивается из зашифрованной файловой системы

    Как изменить идентификатор устройства PCI моей видеокарты в системе? (для установки драйвера Quadro на GeForce)

    Что означает – означает объединение с файлами и каталогами Linux

    Ядро регистрируется при сбое питания

    Как установить образ жесткого диска OpenBSD на Linux?

    Как перемещать файлы во вновь созданный каталог при условии в shell / perl

    Предотвращение создания определенного каталога

    Освободить некоторые устройства от NAT

    RAID 5, построенный с использованием mdadm, запускается в деградированном режиме. Это нормально?

    Что означает термин статическая переменная в unix?

    как добавить принтер в i3

    Debian 8 Mute Audio на Intel NUC

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

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