tee -a no recrea el archivo

tee -a no recrea el archivo

Estoy ejecutando el siguiente comando en la última versión de Raspberry Pi 3 Debian:

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

El comando funciona bien y hace lo que debería; sin embargo, cuando elimino (manualmente o mediante CRON) el klima.outarchivo, no se vuelve a crear. El comando continúa ejecutándose, el archivo de registro continúa anexándose, pero el klima.outarchivo no regresa. (tampoco hay almacenamiento en búfer). Quiero eliminarlo una vez a la semana para no dejar que crezca más allá de todos los límites. ¿Alguna sugerencia?

Respuesta1

Supongo que su canalización se está ejecutando durante mucho tiempo y que está intentando eliminar el archivo de registro mientras se está ejecutando.

Cuando elimina el archivo, el teeproceso todavía lo tiene abierto para escritura, lo que significa que el espacio en disco no se devuelve al sistema. Eso no sucederá hasta que se cierren todos los descriptores de archivos abiertos que hacen referencia al archivo.

Está perfectamente bien escribir en un archivo que ha sido eliminado, siempre que el descriptor del archivo se haya asignado antes de la eliminación.

Tendrá que reiniciar la canalización para que se vuelva a crear el archivo y para permitir que se recupere el espacio ocupado por el archivo de registro antiguo (ahora sin nombre).

Para evitar tener que reiniciar la canalización, puede optar portruncarel archivo, es decir, recortar su tamaño a cero sin eliminarlo. Esto permitiría teecontinuar agregando el archivo sin tener que volver a abrirlo.

Se puede truncar un archivocomo lo mostró jlliagre en su respuesta, o usando truncate(una utilidad no estándar que forma parte de GNU coreutils):

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

Verel manual paratruncatepara obtener más información sobre esa utilidad.

Respuesta2

Si desea recuperar los bloques de archivos, debe dejar el archivo en blanco, no desvincularlo:

Esta forma portátil debería funcionar con la mayoría de los shells:

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

Desvincular el archivo (es decir rm, ) es eliminar la entrada del directorio, pero no afecta el contenido del archivo (inodo) siempre que los lectores o escritores mantengan el archivo abierto.

Respuesta3

No comprende cómo maneja el sistema los archivos.

Elimina la entrada del archivo, pero el archivo aún existe mientras el programa lo controle. ¡Así que nunca se le notifica que la entrada fue eliminada y aún escribe en el archivo!

Un archivo único puede tener muchas entradas gracias a los enlaces físicos (creados por el comando ln).

Podría escribir su propia versión de tee que cierre y abra el archivo en cada línea que escriba en el archivo, pero tendría un rendimiento muy bajo ya que generaría muchas llamadas al sistema.

Aquí hay una función de shell que dividirá su entrada en varios archivos:

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
}

(Podrías usar "head" en lugar de "dd" si abarcas varias líneas en lugar de un tamaño).

Con bash, puedes usar "sustitución de procesos" como este:

prog1 | tee >( splitInput somefilename ) | prog2

información relacionada