wie man die Datei nohup.out dreht, ohne meine Anwendung zu beenden

10

Meine nohup.outDatei wächst schnell.

Ich führe eine Anwendung im Hintergrund aus, sie schreibt eine nohup.outDatei,

Jetzt muss ich die nohup.outDatei drehen , ohne meine Anwendung zu beenden . Kann das gemacht werden?

user2454307
quelle
Kopieren und dann abschneiden.
Jenny D
Möglicherweise verliert er einige wertvolle Protokolleinträge zwischen diesen beiden von Ihnen vorgeschlagenen Vorgängen. Ich würde es nicht empfehlen.
Cleankod

Antworten:

5

Sie sollten einen Blick auf Flog in Kombination mit werfen logrotate. Wenn Sie Ihre Anwendungsausgabe durch diese leiten, können Sie SIGHUPden Auspeitschungsprozess ausführen, ohne Ihre laufende Anwendung beenden zu müssen.

flog (file logger) ist ein Programm, das Eingaben von STDIN liest und in eine Datei schreibt.

Wenn SIGHUP empfangen wird, wird die Datei erneut geöffnet, wodurch eine Protokollrotation ermöglicht wird [siehe Protokollrotation (8) auf RH.]

Die Protokolldatei wird nur wieder geöffnet, wenn Flog feststellt, dass eine Drehung stattgefunden hat (dh die alte Datei ist verschwunden oder der Inode wurde geändert). Flog ist extrem klein (weniger als 500 Byte Speicherbedarf).

jas_raj
quelle
Kann nohup anstelle von nohup.out eine Pipe verwenden?
Brian Minton
1
Sie können die Dateiumleitung (>) verwenden, um in eine andere Datei als nohup.out gemäß der Manpage To save output to FILE, use 'nohup COMMAND > FILE'
auszugeben
4

Sie können es nicht drehen. Sie können es mit dem Befehl abschneiden >nohup.out, der alle Inhalte in der Datei löscht.

Sie können die Datei zuerst kopieren und dann abschneiden, wenn Sie die Ausgabe speichern müssen. Es gibt jedoch ein kleines Fenster für ein Rennen, in dem die Ausgabe geschrieben werden kann, nachdem Sie die Datei kopiert, aber bevor Sie sie abgeschnitten haben. Alle während dieses Fensters geschriebenen Ausgaben gehen für immer verloren.

Kasperd
quelle
1
Ich glaube, dass das Abschneiden keinen Speicherplatz auf der Festplatte freigibt, bis das Dateihandle geschlossen wird.
Symcbean
@symcbean Dein Glaube ist falsch. Durch das Abschneiden der Datei wird der Speicherplatz sofort freigegeben.
Kasperd
Logrotate copytruncate sollte den Trick machen.
user9517
@Iain Die Schritte, die ich beschreibe, entsprechen copytruncatein logrotate. Dies nohup.outist jedoch selten die Art von Datei, für die Sie einen Cron-Job so konfigurieren würden, dass er rotiert.
Kasperd
2

Das kannst du nicht.

Sie können die Verknüpfung der Datei (rm) aufheben, aber die Daten haben immer noch einen Footprint auf der Festplatte und werden weiterhin beschrieben, solange ein offenes Dateihandle vorhanden ist.

Sie können die Datei umbenennen - dies verhindert jedoch nicht, dass in sie geschrieben wird (aber wenn Sie regelmäßig Hintergrundjobs starten, schreiben die neueren in dieselbe Datei).

Eigentlich sollten Sie die Ausgabe des Jobs explizit auf etwas umleiten, das dafür ausgelegt ist (z . B. Apache-Rotatelogs ).

symcbean
quelle
logrotate copytruncate jemand?
user9517
Das hängt ganz davon ab, ob nohup zeilenweise an nohup.out angehängt wird oder ob ein Zeiger auf den Speicherort von nohup.out beibehalten wird. Ein Beispiel finden Sie unter serverfault.com/questions/221337/… .
Pepoluan
1

Logrotate verfügt über eine Copytruncate-Option, mit der Ihre angegebene Datei abgeschnitten (leer) wird, nachdem sie in das normale Rotationsschema (und ggf. die Komprimierung) kopiert wurde.

   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.

Aus der Logrotate-Manpage .

Sgaduuw
quelle
1

Sie können so etwas tun:

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

Sie müssen Ihre App nicht beenden.

Philippe Remy
quelle
1

Ich bin mir nicht sicher, ob ich zu spät dran bin. Aber für andere, die jetzt über dieses Forum stolpern, musste ich nichts mit Flog oder so ausprobieren.

Mein Job beginnt einfach so:

nohup <my process> &

Dadurch wird mein Job gestartet und an eine nohup.out in diesem Verzeichnis angehängt.

Alles, was ich tun musste, war, eine Logrotate einzurichten, die normalerweise mit der Distribution geliefert wird, und so etwas in zu konfigurieren /etc/logrotate.conf

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

Und es hat funktioniert!! nohup.out wurde abgeschnitten, während die neuen Anhänge an dieselbe Datei angehängt wurden. Der Prozess ist auch nicht gestorben. Und ein neues nohup.out wie nohup.out-20190528dieses wurde erstellt.

Hoffe das hilft.

Lokesh
quelle