Trouver le temps d'exécution d'une commande avec le recul

22

Je viens d'exécuter un processus de longue durée à partir de l'invite bash. Avec le recul, j'aurais aimé courir timedessus, ou noter l'heure à laquelle je l'ai lancé.

Existe-t-il un moyen d'obtenir ces informations rétrospectivement? Le .bash_historyne semble pas inclure d'horodatage.

Dans mon cas particulier, c'est Mac OS X, mais je suis intéressé par les solutions générales Unix / Linux.

Pour clarifier, le processus est maintenant terminé, et je préfère ne pas le relancer à moins que cela ne soit absolument nécessaire!

Graham Borland
la source
J'ai également toujours oublié cela et j'ai configuré mon invite pour afficher l'heure.
math

Réponses:

23

bash se souvient en fait des temps jusqu'à ce que vous fermiez la coque.

Alors essayez de courir

HISTTIMEFORMAT='%x %X ' history

Si vous mettez également

HISTTIMEFORMAT=<some format>

dans votre ~/.bashrc, il sera également écrit à la ~/.bash_historysortie, afin que vous puissiez également vérifier ce qui s'est passé dans les sessions shell précédentes.

Mikel
la source
Awesome Mike, ne pensait même pas que c'était possible.
Tim
9

La réponse de Mikel est bonne, sauf que si vous exécutez le programme et que vous vous absentez pendant un certain temps, vous ne pouvez pas vraiment être sûr de la fin du processus. Donc, même si vous avez le temps lorsque vous avez commencé le programme, vous ne savez pas combien de temps cela a pris.

Je n'ai pas de solution pour le cas où vous devez le découvrir sans préparation. Cependant, si vous voulez recommencer, vous pouvez faire comme moi: imprimer l'heure actuelle avec l'invite du shell. De cette façon, si le terminal est toujours ouvert, vous pouvez voir l'heure à laquelle vous avez démarré le programme et l'heure à laquelle l'invite suivante est imprimée. Un peu de calcul vous donnera le temps d'exécution.

Pour ce faire bash, mettez ceci dans votre .bashrc:

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

Dans zsh, mettez ceci dans votre .zshrc:

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

Ce qui précède donnera à votre invite shell un format de <time> <username>@<hostname> <current dir> <$ or % or #>. Pour différents shells et invites fantaisies folles , lisez la page de manuel de votre shell.

Remarque: cela n'aidera probablement pas si vous avez besoin d'une grande précision ou si le programme produit tellement de résultats que vous ne pouvez pas voir l'invite précédente.

phunehehe
la source
2
J'inclus un horodatage dans mon invite de shell pour cette raison, mais sachez que l'heure indiquée dans l'invite est celle à laquelle l'invite a été imprimée, ce qui peut être très différent de l'heure à laquelle vous avez fini de taper et appuyez sur Entrée pour démarrer la commande. En d'autres termes, n'oubliez pas de prendre en compte vous-même le "temps d'inactivité rapide".
jw013
5

Si le processus est toujours en cours d'exécution, vous pouvez utiliser pspour obtenir l'heure à laquelle il a démarré et combien de temps CPU il a utilisé.

Par exemple, pour tous les processus:

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

Pour un pid particulier (12345):

ps -p 12345 -o cputime,start,pid,command,args
jsbillings
la source
Merci, mais le processus est déjà terminé. Je garderai cela à l'esprit si je l'exécute à nouveau.
Graham Borland
J'utilise GNU pssous linux, le pssous MacOSX pourrait être BSD et je ne suis pas sûr des arguments.
jsbillings
Gardez également à l'esprit que le temps processeur n'est pas "en temps réel"
Juan
4

lastcomm (si la comptabilité des processus BSD est activée) vous donnera la durée d'exécution (dans un sens limité qui peut ou non être adéquat).

Martin Keegan
la source