Ermitteln der Befehlsausführungszeit im Nachhinein

22

Ich habe gerade einen langen Prozess von der Bash-Eingabeaufforderung ausgeführt. Im Nachhinein wünschte ich, ich würde darauf herumlaufen timeoder mir die Zeit notieren, zu der ich es angepfiffen habe.

Gibt es eine Möglichkeit, diese Informationen nachträglich abzurufen? Das .bash_historyscheint keine Zeitstempel zu enthalten.

In meinem speziellen Fall ist es Mac OS X, aber ich interessiere mich für allgemeine Unix / Linux-Lösungen.

Zur Verdeutlichung ist der Vorgang nun abgeschlossen, und ich würde es vorziehen, ihn nicht erneut auszuführen, es sei denn, dies ist unbedingt erforderlich!

Graham Borland
quelle
Ich habe dies auch immer vergessen und meine Eingabeaufforderung so konfiguriert, dass die Uhrzeit angezeigt wird.
Mathe

Antworten:

23

bash merkt sich eigentlich die Zeiten, bis man die Shell schließt.

Also lauf mal

HISTTIMEFORMAT='%x %X ' history

Wenn Sie auch setzen

HISTTIMEFORMAT=<some format>

In Ihrem ~/.bashrcwird es auch ~/.bash_historybeim Beenden geschrieben, sodass Sie auch überprüfen können, was in früheren Shell-Sitzungen passiert ist.

Mikel
quelle
Super Mike, hätte nicht gedacht, dass das möglich ist.
Tim
9

Die Antwort von Mikel ist gut, außer dass Sie nicht wirklich sicher sein können, wann der Prozess abgeschlossen ist, wenn Sie das Programm ausführen und für eine Weile weggehen. Selbst wenn Sie die Zeit haben, in der Sie das Programm gestartet haben, wissen Sie nicht, wie lange es gedauert hat.

Ich habe keine Lösung für den Fall, dass Sie es ohne Vorbereitung herausfinden müssen. Wenn Sie das aber noch einmal machen wollen, können Sie es wie ich machen: Drucken Sie die aktuelle Zeit zusammen mit der Shell-Eingabeaufforderung. Auf diese Weise sehen Sie, wenn das Terminal noch geöffnet ist, die Uhrzeit, zu der Sie das Programm gestartet haben, und die Uhrzeit, zu der die nächste Eingabeaufforderung gedruckt wird. Ein bisschen Mathe bringt dir die Ausführungszeit.

Um dies zu tun bash, geben Sie dies ein in .bashrc:

export PS1="\A \u@\h \W \$ "

In zsh, diese in deinem .zshrc:

export PS1="%D{%H:%M} %n@%m %1~ %# "

Das Obige gibt Ihrer Shell-Eingabeaufforderung ein Format von <time> <username>@<hostname> <current dir> <$ or % or #>. Für die verschiedenen Schalen und verrückt Phantasie Aufforderungen, lesen Sie die man - Seite von Shell.

Hinweis: Dies ist wahrscheinlich nicht hilfreich, wenn Sie eine hohe Genauigkeit benötigen oder wenn das Programm so viel ausgibt, dass Sie die vorherige Eingabeaufforderung nicht sehen können.

phunehehe
quelle
2
Aus diesem Grund füge ich einen Zeitstempel in meine Shell-Eingabeaufforderung ein. Beachten Sie jedoch, dass die in der Eingabeaufforderung angezeigte Zeit der Zeitpunkt ist, an dem die Eingabeaufforderung gedruckt wurde. Dies unterscheidet sich möglicherweise erheblich von dem Zeitpunkt, zu dem Sie die Eingabe beendet und den Befehl mit der Eingabetaste gestartet haben. Mit anderen Worten, denken Sie daran, die "prompte Leerlaufzeit" selbst zu berücksichtigen.
JW013
5

Wenn der Prozess noch ausgeführt wird, können psSie die Startzeit und die verwendete CPU-Zeit ermitteln.

Zum Beispiel für alle Prozesse:

ps -eo cputime,start,pid,command,args

Für eine bestimmte PID (12345):

ps -p 12345 -o cputime,start,pid,command,args
jsbillings
quelle
Danke, aber der Vorgang ist bereits abgeschlossen. Ich werde es mir merken, wenn ich es noch einmal mache.
Graham Borland
Ich verwende GNU psunter Linux, das psunter MacOSX ist möglicherweise BSD und ich bin mir der Argumente nicht sicher.
Jsbillings
Denken Sie auch daran, dass die CPU-Zeit nicht "Echtzeit" ist
Juan
4

lastcomm (wenn BSD-Prozessabrechnung aktiviert ist) gibt Ihnen die Ausführungsdauer an (in einem begrenzten Sinn, der möglicherweise angemessen ist oder nicht).

Martin Keegan
quelle