Czy istnieje sposób, aby „top” uruchomił się dokładnie raz i zakończył działanie?

13

Uważam, że dane wyjściowe polecenia powłoki topsą prostym i znanym sposobem na uzyskanie przybliżonego obrazu stanu maszyny. Chciałbym podawać topdane wyjściowe (lub coś bardzo podobnego do tego) z małego serwera WWW na maszynie do surowego monitorowania.

Czy istnieje sposób, aby uzyskać najlepsze zapisanie tekstu wyjściowego dokładnie raz , bez formatowania znaków? Próbowałem tego:

(sleep 1; echo 'q') | top > output.txt

To wydaje się być bliskie temu, czego chcę, poza tym, że (1) nie ma gwarancji, że nie otrzymam więcej niż jednego ekranu informacji i (2) muszę usunąć wszystkie znaki formatujące terminal.

A może jest jakieś inne toppodobne polecenie, które wyświetla informacje o pamięci / zużyciu procesora / czasie pracy na poziomie całego komputera?

(Idealnie, chciałbym mieć strategię, która jest przenośna zarówno na system Linux, jak i Mac OS X, ponieważ nasi twórcy używają komputerów Mac, a naszym środowiskiem produkcyjnym jest Linux).

Mickalot
źródło

Odpowiedzi:

23

W systemie Linux możesz wypróbować:

top -bn1 > output.txt

Od man top:

-b : Batch-mode operation
            Starts top in 'Batch' mode, which could be useful for sending
            output from top to other programs or  to  a  file.   In  this
            mode, top will not accept input and runs until the iterations
            limit you've set with the '-n' command-line option  or  until
            killed.
....
-n : Number-of-iterations limit as:  -n number
            Specifies  the  maximum  number of iterations, or frames, top
            should produce before ending.

W systemie OS X spróbuj:

top -l 1

Z góry strony OSX :

 -l <samples>
              Use logging mode and display <samples> samples, even if 
              standard output is a terminal. 0 is treated  as  infinity.   
              Rather than redisplaying, output is periodically printed in 
              raw form. Note that the first sample displayed will have an 
              invalid %CPU displayed for each process,  as it is calculated 
              using the delta between samples.
Cuonglm
źródło
To wygląda dokładnie odpowiedź, której szukałbym, gdyby topw OS X obsługiwał flagę -b. :-( Niestety tak nie jest i nie widzę wersji topdostępnej przez homebrew. Wydaje się, że jest to właściwa odpowiedź dla Linuksa, chociaż.
Mickalot
@Mickalot: Zobacz moją zaktualizowaną. Czy możesz zainstalować GNU top w Mac OSX?
cuonglm
@Gnuoc: /usr/bin/top -l 1na OSX 10.9.4 jest idealny ... dzięki! Jeśli chodzi o instalację GNU top, mógłbym zainstalować go na moim komputerze, ale musiałbym przekonać innych programistów do zainstalowania go na swoich komputerach, aby mój kod działał dla nich, więc wolałbym tego unikać. (Jeśli nie będzie dostępny przez Homebrew, pojawi się opór.) Teraz, gdy będę się zmieniał w oparciu o platformę, będę chciwy ... czy znasz jakieś pół-ekwiwalenty Windows, więc ci deweloperzy (mamy kilka) może mieć również nieprzetworzoną stronę statusu? (Jeśli nie, to dobrze, twoja odpowiedź jest już bardzo pomocna!)
Mickalot,
@Mickalot: Zapamiętaj notatkę z górnej strony podręcznika OSX. Zauważ, że na pierwszej wyświetlonej próbce będzie wyświetlany nieprawidłowy% procesora dla każdego procesu, ponieważ jest obliczany na podstawie delty między próbkami. . Użytkownicy systemu Windows mogą użyć `` cygwin``
cuonglm
@Gnuoc Dzięki za dodatkowy punkt. Chyba mogę to zrobić top -l 2i wyrzucić pierwszą stronę próbek?
Mickalot,
1

Aby uzyskać podobne numery typów z systemu Windows, powinieneś rzucić okiem na PowerShell.

Tylko po to, aby uzyskać listę procesów, na które możesz spojrzeć get-process. Spójrz na to odniesienie .

W jakiejś dalszych poszukiwań, znaleźliśmy przyjemne polecenie trochę tutaj .

Co, jeśli weźmiesz poza prezentowaną pętlę while, dla twoich potrzeb byłoby:

ps | sort -desc cpu | select -first 30

psw PowerShell to pseudonim get-process.

Yuppers
źródło
To brzmi jak świetny pomysł! Poproszę jednego z moich współpracujących z Windows współpracowników, aby to wypróbowali ...
Mickalot,