
Estoy intentando escribir un buen archivo csv basado en algún resultado de la parte superior. Vuelvo a formatear la salida con awk así:
top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'
Eso funciona perfectamente. Ahora quiero guardar el resultado en un archivo. Creo que el uso > output.log
debería funcionar:
top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log
Sin embargo, esto simplemente da como resultado un archivo vacío cuando presiono Ctrl-C fuera del proceso superior. ¿Qué estoy haciendo mal?
Respuesta1
La biblioteca de E/S estándar de Unix (“stdio”) detecta en qué tipo de cosa (receptor de datos) está escribiendo. Si detecta una terminal (es decir, una ventana), escribe datos inmediatamente cuando el programa los solicita. Sin embargo, al escribir en un archivo, la biblioteca de E/S almacena los datos en un buffer y los escribe en bloques de 512 (o más) bytes a la vez. Por supuesto, vacía el búfer (escribiendo un bloque parcial) cuando el programa que llama sale, si sale limpiamente. Una terminación anormal (como la causada por Ctrl+ C) puede dejar un archivo de salida incompleto.
Para solucionarlo, intente:
top -b | ( trap "" 2; nawk '
(tunawk
orden)' > output.log)
`
El trap
comando lo hará nawk
inmune al Ctrl+ C. (Por supuesto, el Ctrl+ Cseguirá interrumpiendo el top
proceso y nawk
finalizará (¡limpiamente!) cuando llegue a un final de archivo (EOF) en la tubería.
PD: Esto supone (requiere) que esté ejecutando bash
un bash
shell compatible.
Respuesta2
Top sigue corriendo. Quieres ejecutarlo una cantidad limitada de veces. Utilice la opción -n. al igual que:
top -b -n 1 | awk '{ ... }'
Alternativamente, puede salir de top cuando lo desee con C-\. Usar Cc lo abortará y romperá la tubería prematuramente (antes de que awk obtenga algo).
$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo