comment faire pivoter le fichier nohup.out sans tuer mon application

10

Mon nohup.outdossier se développe rapidement.

J'exécute une application en arrière-plan, elle écrit un nohup.outfichier,

maintenant, je dois faire pivoter le nohup.outfichier sans tuer mon application. Cela peut-il être fait?

user2454307
la source
Copiez, puis tronquez.
Jenny D
Il peut perdre quelques précieuses entrées de journal entre ces deux opérations que vous avez suggérées. Je ne le recommanderais pas.
Cleankod

Réponses:

6

Vous devriez jeter un œil au fouet en combinaison avec logrotate. Si vous dirigez la sortie de votre application à travers cela, vous pouvez alors SIGHUPle processus de fouet sans avoir à tuer votre application en cours d'exécution.

flog (enregistreur de fichiers) est un programme qui lit les entrées de STDIN et écrit dans un fichier.

Si SIGHUP est reçu, le fichier sera rouvert, permettant la rotation du journal [voir logrotate (8) sur RH.]

Le fichier journal ne sera rouvert que si Flog détecte que la rotation s'est produite (c'est-à-dire, l'ancien fichier a disparu ou l'inode a changé). le flog est extrêmement petit (moins de 500 octets de mémoire).

jas_raj
la source
Nohup peut-il utiliser un tuyau au lieu de nohup.out?
Brian Minton
1
Vous pouvez utiliser la redirection de fichiers (>) pour sortir vers un fichier autre que nohup.out selon la page de manuel:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj
4

Vous ne pouvez pas le faire pivoter. Vous pouvez le tronquer avec la commande >nohup.out, qui supprimera tout le contenu du fichier.

Vous pouvez d'abord copier le fichier, puis le tronquer, si vous devez enregistrer la sortie. Mais il y a une petite fenêtre pour une course, où la sortie peut être écrite après avoir copié le fichier mais avant de le tronquer. Toute sortie écrite pendant cette fenêtre sera définitivement perdue.

kasperd
la source
1
Je pense que la troncature ne libérera pas d'espace sur le disque tant que le descripteur de fichier n'est pas fermé.
symcbean
@symcbean Votre opinion est incorrecte. La troncature du fichier libère immédiatement l'espace.
kasperd
Logrotate copytruncate devrait faire l'affaire.
user9517
@Iain Les étapes que je décris sont équivalentes à copytruncatein logrotate. Mais nohup.outc'est rarement le type de fichier que vous configurez pour faire tourner une tâche cron.
kasperd
2

Tu ne peux pas.

Vous pouvez dissocier le fichier (rm) mais les données ont toujours une empreinte sur le disque et continueront d'être écrites tant qu'il y aura un descripteur de fichier ouvert.

Vous pouvez renommer le fichier - mais encore une fois cela ne l'empêche pas d'être écrit (mais si vous démarrez régulièrement des tâches d'arrière-plan, les plus récentes écriront dans le même fichier).

Vraiment, vous devriez explicitement rediriger la sortie du travail vers quelque chose conçu pour gérer cela (par exemple, les journaux de rotation apache ).

symcbean
la source
logrotate copytruncate quelqu'un?
user9517
Cela dépend totalement de si nohup s'ajoute à nohup.out ligne par ligne, ou s'il maintient un pointeur vers l'emplacement de nohup.out. Voir serverfault.com/questions/221337/… pour un exemple.
pepoluan
2

Je ne sais pas si je suis trop en retard à ce sujet. Mais pour ceux qui tombent sur ce forum maintenant, je n'ai pas eu à essayer quoi que ce soit avec du fouet ou quoi que ce soit.

Mon travail commence simplement comme ceci:

nohup <my process> &

Cela démarre mon travail et commence à s'ajouter à un nohup.out dans ce répertoire.

Tout ce que j'avais à faire était de configurer un logrotate qui vient généralement avec la distribution et de configurer quelque chose comme ça dans /etc/logrotate.conf

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

Et ça a marché !! nohup.out était tronqué lors de l'obtention des nouveaux ajouts sur le même fichier. Le processus n'est pas mort non plus. Et un nouveau nohup.out comme nohup.out-20190528celui-ci a été créé.

J'espère que cela t'aides.

Lokesh
la source
1

Logrotate a une option de copie tronquée disponible, qui tronquera (vide) votre fichier spécifié après qu'il a été copié dans le schéma de rotation (et de compression, si défini) normal.

   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.

Depuis la page de manuel logrotate .

Sgaduuw
la source
1

Vous pouvez faire quelque chose comme ça:

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

Vous n'avez pas besoin de tuer votre application.

Philippe Remy
la source