come ruotare il file nohup.out senza uccidere la mia applicazione


10

Il mio nohup.outfile sta crescendo rapidamente.

Sto eseguendo un'applicazione in background, sta scrivendo un nohup.outfile,

ora ho bisogno di ruotare il nohup.outfile senza uccidere la mia applicazione. Può essere fatto?


Copia, quindi tronca.
Jenny D,

Potrebbe perdere alcune preziose voci di registro tra queste due operazioni che hai suggerito. Non lo raccomanderei.
Cleankod,

Risposte:


6

Dovresti dare un'occhiata a flog in combinazione con logrotate. Se si SIGHUPesegue il pipe dell'output dell'applicazione in questo modo, è possibile eseguire il processo flog senza interrompere l'applicazione in esecuzione.

flog (file logger) è un programma che legge input da STDIN e scrive su un file.

Se si riceve SIGHUP, il file verrà riaperto, consentendo la rotazione del registro [vedere logrotate (8) su RH.]

Il file di registro verrà riaperto solo se flog rileva che si è verificata una rotazione (ovvero, se il vecchio file è andato o l'inode è cambiato). flog è estremamente piccolo (meno di 500 byte di memoria).


Nohup può usare una pipe invece di nohup.out?
Brian Minton,

1
È possibile utilizzare il reindirizzamento dei file (>) per l'output su un file diverso da nohup.out secondo la pagina man:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

Non puoi ruotarlo. Puoi troncarlo con il comando >nohup.out, che eliminerà tutti i contenuti nel file.

È possibile copiare prima il file e poi troncarlo, se è necessario salvare l'output. Ma c'è una piccola finestra per una gara, in cui l'output può essere scritto dopo aver copiato il file ma prima di troncarlo. Qualsiasi output scritto durante quella finestra andrà perso per sempre.


1
Credo che il troncamento non libererà spazio sul disco fino alla chiusura dell'handle del file.
symcbean,

@symcbean La tua convinzione è errata. Troncare il file libera immediatamente lo spazio.
Kasperd,

Logrotate copytruncate dovrebbe fare il trucco.
user9517

@Iain I passaggi che descrivo sono equivalenti a copytruncatein logrotate. Ma nohup.outraramente è il tipo di file che configureresti per ruotare un lavoro cron.
Kasperd,

2

Non puoi.

È possibile scollegare il file (rm) ma i dati hanno ancora un footprint sul disco e continueranno a essere scritti fino a quando è presente un handle di file aperto.

È possibile rinominare il file, ma di nuovo ciò non impedisce che venga scritto (ma se si avvia regolarmente un processo in background, i più recenti scriveranno nello stesso file).

In realtà dovresti reindirizzare esplicitamente l'output del lavoro su qualcosa progettato per gestirlo (ad es. Rotatelog di apache ).


logrotate copytruncate qualcuno?
user9517

Ciò dipende totalmente dal fatto che nohup accoda riga per riga nohup.out o che mantenga un puntatore alla posizione di nohup.out. Vedere serverfault.com/questions/221337/… per un esempio.
pepoluan

2

Non sono sicuro che sia troppo tardi per questo. Ma per gli altri che si imbattono in questo forum ora, non ho dovuto provare nulla con flog o altro.

Il mio lavoro inizia così:

nohup <my process> &

Questo inizia il mio lavoro e inizia ad aggiungere un nohup.out in quella directory.

Tutto quello che dovevo fare era impostare un logrotate che di solito viene fornito con la distribuzione e configurare qualcosa del genere in /etc/logrotate.conf

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

E ha funzionato !! nohup.out veniva troncato mentre otteneva i nuovi accodamenti sullo stesso file. Neanche il processo è morto. E un nuovo nohup.out come nohup.out-20190528questo è stato creato.

Spero che sia di aiuto.


1

Logrotate ha un'opzione copytruncate disponibile, che tronca (svuota) il file specificato dopo che è stato copiato nel normale schema di rotazione (e compressione, se impostato).

   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.

Dalla manpage logrotate .


1

Puoi fare qualcosa del genere:

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

Non è necessario uccidere la tua app.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.