cómo rotar el archivo nohup.out sin matar mi aplicación

10

Mi nohup.outarchivo está creciendo rápidamente.

Estoy ejecutando una aplicación en segundo plano, está escribiendo un nohup.outarchivo,

ahora necesito rotar el nohup.outarchivo sin matar mi aplicación. Se puede hacer esto?

usuario2454307
fuente
Copiar, luego truncar.
Jenny D
Puede perder algunas entradas de registro preciosas entre estas dos operaciones que sugirió. Yo no lo recomendaría.
Cleankod

Respuestas:

5

Deberías echar un vistazo a flog en combinación con logrotate. Si canaliza la salida de su aplicación a través de esto, puede realizar SIGHUPel proceso de flagelación sin tener que matar su aplicación en ejecución.

flog (registrador de archivos) es un programa que lee la entrada de STDIN y escribe en un archivo.

Si se recibe SIGHUP, el archivo se volverá a abrir, permitiendo la rotación del registro [ver logrotate (8) en RH].

El archivo de registro solo se volverá a abrir si flog detecta que se ha producido una rotación (es decir, si el archivo anterior desapareció o si se cambió el inodo). flog es extremadamente pequeño (huella de memoria de menos de 500 bytes).

jas_raj
fuente
¿Nohup puede usar una tubería en lugar de nohup.out?
Brian Minton
1
Puede usar la redirección de archivos (>) para generar un archivo que no sea nohup.out según la página de manual:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj
4

No puedes rotarlo. Puede truncarlo con el comando >nohup.out, que eliminará todo el contenido del archivo.

Puede copiar el archivo primero y luego truncarlo, si necesita guardar la salida. Pero hay una pequeña ventana para una carrera, donde la salida se puede escribir después de copiar el archivo pero antes de truncarlo. Cualquier salida escrita durante esa ventana se perderá para siempre.

kasperd
fuente
1
Creo que truncar no liberará espacio en el disco hasta que se cierre el identificador de archivo.
symcbean
@symcbean Su creencia es incorrecta. Truncar el archivo libera el espacio inmediatamente.
kasperd
Logrotate copytruncate debería hacer el truco.
user9517
@Iain Los pasos que describo son equivalentes a copytruncatein logrotate. Pero nohup.outrara vez es el tipo de archivo en el que configuraría un trabajo cron para rotar.
kasperd
2

No puedes

Puede desvincular el archivo (rm) pero los datos aún tienen una huella en el disco y se seguirán escribiendo mientras exista un identificador de archivo abierto.

Puede cambiar el nombre del archivo, pero nuevamente esto no impide que se escriba (pero si está iniciando trabajos en segundo plano regularmente, los más nuevos escribirán en el mismo archivo).

Realmente debe redirigir explícitamente la salida del trabajo a algo diseñado para manejar esto (por ejemplo, apache rotatelogs ).

symcbean
fuente
logrotate copytruncate cualquiera?
user9517
Eso depende totalmente de si nohup se agrega a nohup.out línea por línea, o si mantiene un puntero a la ubicación de nohup.out. Consulte serverfault.com/questions/221337/… para ver un ejemplo.
pepoluan
1

Logrotate tiene una opción copytruncate disponible, que truncará (vaciará) su archivo especificado después de que se haya copiado en el esquema de rotación normal (y compresión, si está configurado).

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

Desde la página de manual de logrotate .

Sgaduuw
fuente
1

Puedes hacer algo como esto:

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

No necesitas matar tu aplicación.

Philippe Remy
fuente
1

No estoy seguro si llego demasiado tarde en esto. Pero para otros que ahora se topan con este foro, no tuve que probar nada con flog ni nada.

Mi trabajo comienza simplemente así:

nohup <my process> &

Esto inicia mi trabajo y comienza a agregar un nohup.out en ese directorio.

Todo lo que tenía que hacer era configurar un logrotate que generalmente viene con la distribución y configurar algo como esto en /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

¡¡Y funcionó!! nohup.out se estaba truncando al obtener los nuevos anexos en el mismo archivo. El proceso tampoco murió. Y nohup.out-20190528se creó un nuevo nohup.out como este.

Espero que esto ayude.

Lokesh
fuente