Meine nohup.out
Datei wächst schnell.
Ich führe eine Anwendung im Hintergrund aus, sie schreibt eine nohup.out
Datei,
Jetzt muss ich die nohup.out
Datei drehen , ohne meine Anwendung zu beenden . Kann das gemacht werden?
Meine nohup.out
Datei wächst schnell.
Ich führe eine Anwendung im Hintergrund aus, sie schreibt eine nohup.out
Datei,
Jetzt muss ich die nohup.out
Datei drehen , ohne meine Anwendung zu beenden . Kann das gemacht werden?
Antworten:
Sie sollten einen Blick auf Flog in Kombination mit werfen logrotate
. Wenn Sie Ihre Anwendungsausgabe durch diese leiten, können Sie SIGHUP
den 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).
To save output to FILE, use 'nohup COMMAND > FILE'
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.
copytruncate
in logrotate
. Dies nohup.out
ist jedoch selten die Art von Datei, für die Sie einen Cron-Job so konfigurieren würden, dass er rotiert.
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 ).
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 .
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.
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-20190528
dieses wurde erstellt.
Hoffe das hilft.