Existe-t-il une commande unix pour produire le temps écoulé pendant une commande?

J'aime utiliser le time pour savoir combien de temps une commande a pris pour exécuter, mais lorsqu'il s'agit de commandes qui exécutent des sous-commandes en interne (et fournissent une sortie qui vous permet de dire quand chaque sous-commande commence à s'exécuter), il serait vraiment formidable de Être en mesure de dire après quel nombre de secondes (ou millisecondes) une sous-commande spécifique a commencé à fonctionner.

Lorsque je dis sous-commande, vraiment la seule façon de les distinguer de l'extérieur est tout imprimé à la norme.

Vraiment, cela semble être une option du time .

Il serait vraiment formidable de pouvoir dire après quel nombre de secondes (ou millisecondes) une sous-commande spécifique a commencé à courir

Une possibilité est d'utiliser cette variable bash :

SECONDS

Cette variable se développe au nombre de secondes depuis la création du shell. L'affectation à cette variable réinitialise le compte à la valeur attribuée, et la valeur étendue devient la valeur attribuée plus le nombre de secondes depuis l'affectation.

Pour combiner cela avec un flux de sortie, considérez ce script dédié qui ajoute un horodatage à chaque ligne d'entrée:

 $ cat timestamp-output #!/bin/bash while read line do printf "%05d %s\n" $SECONDS "$line" done 

Et faites passer la sortie de votre script dans ce script.

 $ your-script | timestamp-output 

Exemple:

 $ cat your-script #!/bin/bash for i in 1 2 3 4 do echo "step $i started"; sleep $(($RANDOM%10)); done $ your-script | timestamp-output 

Sortie:

00000 étape 1 a commencé
00002 étape 2 démarrée
00010 étape 3 a commencé
00015 étape 4 a commencé


Cela pourrait être raffiné à l'horodatage uniquement des lignes de sortie qui signalent le début d'une sous-commande, en supposant qu'elles peuvent être grep'ed:

 #!/bin/bash regex="^start of command" while read line do if [[ "$line" =~ $regex ]]; then printf "%05d %s\n" $SECONDS "$line" else echo "$line" fi done 

Exemple de script:

 #!/bin/bash for i in 1 2 3 4 do echo "start of command: $i"; echo some output echo other output sleep $(($RANDOM%10)); done 

Exemple de sortie:

 00000 début de commande: 1
 Certains résultats
 Autre sortie
 00002 début de commande: 2
 Certains résultats
 Autre sortie
 00006 début de commande: 3
 Certains résultats
 Autre sortie
 00008 début de commande: 4
 Certains résultats
 Autre sortie

Si vous devez savoir quand les processus enfants commencent à s'exécuter, vous pouvez utiliser strace -f -tt et analyser la sortie, ou éventuellement rouler votre propre script pour faire cela pour vous.