2013-08-30 12 views
12

Ho testato il seguente comando, ma non funziona.Perché "in alto | grep> file 'non funziona?

$> top -b -d 1 | grep java > top.log 

Non utilizza l'errore standard. Ho controllato che usi l'output standard, ma top.log è sempre vuoto. Perchè è questo?

+0

Non ne sono del tutto sicuro, ma penso che il top sia "interattivo" e non abbia un tipico flusso di output standard. Quindi grep non sta ottenendo l'input forse. – squiguy

+0

Java è effettivamente in esecuzione e richiede risorse sufficienti per essere visualizzato? – user2357112

+0

A giudicare dalla [man page] (http://www.unixtop.org/man.shtml), le opzioni che stai trasmettendo a 'top' sembrano ridondanti. – user2357112

risposta

23

Per default, grep uscita buffer che implica che nulla saranno scritti top.log finché l'uscita grep supera la dimensione del buffer (che può variare tra sistemi).

indicare a grep di utilizzare il buffer di linea in uscita. Prova:

top -b -d 1 | grep --line-buffered java > top.log 
+0

Grande! Funziona bene. Grazie mille. – JaycePark

+0

Non dovrebbe 'grep' svuotare l'output quando' top' esce? Con '-d 1', sembra che dovrebbe accadere immediatamente. – user2357112

+0

@ user2357112 Solo se uscisse! – devnull

2

Nella mia macchina incorporata, grep non aveva l'opzione --line-buffered. Così ho usato questa soluzione per il mio me stesso:

while :;do top -b -n 1 | grep java >> top.log;done & 

In questo modo ho potuto avere un monitor in esecuzione in background di un programma come "Java" e mantenere tutti i risultati nel file top.log.