2011-11-09 4 views
2

débutant awk ici .. J'essaie ceci:AWK pas l'impression de fichier

top -b -p 30259 | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory"} /tomcat/ { print strftime("%H:%M:%S"), $9, $10 }' > asdf.log 

Mais 'asdf.log' reste toujours vide. J'ai essayé de rediriger vers fichier à partir du script:

top -b -p 30259 | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory" > "asdf.log"} /tomcat/ { print strftime("%H:%M:%S"), $9, $10 > "asdf.log" }' 

mais il ne fonctionne toujours pas ... Et l'impression à la sortie standard fonctionne très bien.

Qu'est-ce que je fais mal?

+0

Etes-vous certain qu'il existe un processus avec pid '30259' sur le système? – sarnold

+0

oui, sans '>' tout va bien .. je peux voir des données sur la console – zorglub76

Répondre

6

Combien de temps attendez-vous l'arrivée des données?

Lorsque les programmes utilisent la bibliothèque standard C pour écrire des fichiers (fopen(3) et famille de fonctions), la bibliothèque C ajoutera une tampon aux cours d'eau pour améliorer les performances. Si chaque lecture ou écriture d'un caractère commençait réellement un appel système, la performance des programmes communs serait assez horrible. Ainsi, les routines d'entrée standard C soumettront blocs d'E/S lorsque les tampons sont "assez complets".

Les parties délicates vient que les routines C standard IO vont changer leur définition de « suffisamment complète » sur la base des descripteurs de fichiers spécifiques - si le descripteur de fichier est un fichier , le IO est bloc tamponne et vous devez attendre qu'une certaine quantité de données arrive. (. Vérifiez IO Block entrée pour voir la taille la plus probable de stat asdf.log) Toutefois, si le descripteur de fichier est pour stdoutet il fait référence à un dispositif terminal, la sortie est la ligne tamponne - sortie sera envoyée au terminal dès qu'un caractère de nouvelle ligne est imprimé.

Peut-être le setvbuf(3) manpage peut expliquer mieux que moi:

The three types of buffering available are unbuffered, block 
    buffered, and line buffered. When an output stream is 
    unbuffered, information appears on the destination file or 
    terminal as soon as written; when it is block buffered many 
    characters are saved up and written as a block; when it is 
    line buffered characters are saved up until a newline is 
    output or input is read from any stream attached to a 
    terminal device (typically stdin). The function fflush(3) 
    may be used to force the block out early. (See fclose(3).) 
    Normally all files are block buffered. When the first I/O 
    operation occurs on a file, malloc(3) is called, and a buffer 
    is obtained. If a stream refers to a terminal (as stdout 
    normally does) it is line buffered. The standard error 
    stream stderr is always unbuffered by default. 

votre script Modifier ressembler à ceci:

top -b | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory"} 
/bash/ { print strftime("%H:%M:%S"), $9, $10; fflush() }' > /tmp/foo 

La fflush() forces sortie immédiatement. Pas génial pour la performance, mais mieux pour voir l'état de votre système en temps réel.