2010-10-01 41 views
1

Je cours un processus de fond sur Mac et ai un problème avec la mise à jour de journal. Si je lanceComment enregistrer STDOUT d'un processus d'arrière-plan sans mise en tampon sur Mac?

someprog > mylog & 

alors mylog est mis à jour pas immédiatement, mais avec quelques intervalles - je suppose que cela est dû à la mise en mémoire tampon. Même chose avec at now. Si je tue le programme avant que la sortie soit écrite à mylog, alors je perds les données. Il n'y avait pas un tel problème avec le même programme sur les machines Linux, donc j'espère que je peux aussi le mettre à jour à l'exécution sur Mac. Une idée comment?

someprog est un programme F77, qui n'a pas été écrit par mes soins.

I tried to ask cette question à SuperUser, mais personne ne peut m'aider là-bas.

EDIT1: Je n'ai pas envie de changer la source, mais gardez cela à l'esprit. La journalisation fonctionne correctement sur les machines Linux, donc cela devrait aussi fonctionner sur les Mac. Ce doit être un paramètre système, par ex. taille de tampon? Ce serait bien pour moi de limiter la taille de la mémoire tampon à une valeur plus petite - maintenant je dois attendre des heures pour voir quelque chose dans le journal.

Répondre

2

Si vous avez accès au code source, vous pouvez probablement ajouter des appels à fflush (stdout) après chaque printf. Si vous ne le faites pas, vous pouvez essayer quelque chose de compliqué avec LD_PRELOAD ... Fondamentalement, faites votre propre version de printf() qui appelle printf de libc ... ET fait un vidage ... Puis LD_PRELOAD cette bibliothèque quand vous exécutez ... L'application utilisera la vôtre à la place ... Kinda risky tho ...

1

C'est le comportement habituel des programmes POSIX C qui écrivent dans un flux non-tty - je suppose que F77 partage le même comportement, ou est écrit en termes des routines stdio.

Je ne sais pas quelle est la bonne réponse - je suppose que vous aurez besoin de canaliser la sortie par quelque chose qui prétend être un tty, mais désinvolte je ne sais pas quel utilitaire (le cas échéant) fournit cette option .