Tengo un script que siempre da resultados donde lo redirigí a un archivo, lo que estoy tratando de hacer es rotar el archivo redirigido, a continuación es donde inicio el script y lo redirijo:
.
somecode
.
su - username -c "command >> /path/to/directory/output.txt" &
.
.
code continues..
y debajo está el crontab que estoy intentando crear:
cd /path/to/directory/
timestamp=`date "+%Y%m%d"`
mv ./output.txt ./logs/output.txt_$timestamp
touch output.txt
chmod 757 ./output.txt
gzip ./logs/output.txt_$timestamp
find ./logs/output.txt* -type f -mtime +2 | xargs rm
o este tampoco hizo el trabajo:
timestamp=`date "+%Y%m%d"`
cp ./output.txt ./logs/output.txt_$timestamp
echo "" > ./output.txt
gzip ./logs/output.txt_$timestamp
en el primer código, el script original falla y ya no funciona, y en el segundo script no limpia el archivo output.txt.
¿Hay alguna manera de hacerlo manteniendo el script funcionando? Nota; Estoy ejecutando Unix Solaris.
Gracias de antemano.
Respuesta1
Esto generalmente se hace agregando unSuspirocontrolador que reinicia el comandodespués de que algún otro comando (normalmente logrotate
) haya movido el archivo. En los sistemas operativos *nix, puede mover archivos mientras se escriben en ellos (creo que con la advertencia de que aún deben estar en el mismo sistema de archivos); las líneas adicionales se agregarán al archivo en la nueva ubicación.
Respuesta2
Realmente no se puede cambiar el redireccionamiento de un proceso en ejecución stdout
y/o stderr
a un archivo nuevo (consulte la nota a continuación) (Esa es una de las razones por las que usar archivos redirigidos stdout
o stderr
como archivos de registro para procesos de ejecución prolongada es unamaloidea.)
Cuando se inicia el proceso, los elementos de redirección del comando son ejecutados por el shell que inicia el proceso. El archivo de destino se abre y se crea, si es necesario, en el modo adecuado (añadir o sobrescribir) y posiblemente se trunca a cero bytes según el modo de redirección. Luego, el descriptor del archivo abierto se pasa al proceso hijo. Ese descriptor de archivo abierto es el único vínculo al archivo redirigido que tiene el proceso hijo, literalmente. Es un enlace al archivo.
Y ese es un punto importante: como enlace directo al archivo, el descriptor de apertura está a la par con la entrada del directorio del archivo: el "nombre de archivo". Cambiar ese nombre o incluso eliminar esa entrada del directorio, como con el rm
comando, no tiene ningún efecto en el descriptor del archivo abierto en el proceso.
La respuesta de @ l0b0 es correcta: los procesos que necesitan rotar registros tienden a usar SIGHUP
controladores para realizar dichas rotaciones, pero "rotar registros" no es realmente tan simple en el caso de la salida redirigida: ¿cómo se llama el nuevo archivo de salida? El proceso hijo no tiene idea de cuál es su "nombre" stdout
y/o stderr
es, y es posible que el "archivo" de salida ni siquiera sea un archivo en primer lugar.
Los esquemas de rotación de registros deben serdiseñadoen el proceso: el registro debe integrarse de tal manera que las entradas del registro no se pierdan al rotar el archivo de registro, por ejemplo.
(Está bien, puede serposiblepara cambiar las secuencias stdout
/ stderr
para un proceso en ejecución, pero es algo que tiene que ser, nuevamente,diseñadoen el proceso. No es algo que un binario listo para usar, como lo bash
haría automáticamente si le envías un SIGHUP
...)
Respuesta3
Muchas gracias a todos por sus respuestas, no pude encontrar una manera de hacerlo, así que como solución alternativa configuro el crontab para detener el script original, hago la rotación y lo inicio nuevamente en el momento de menor actividad.