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.