Je travaille sur des scripts batch impliquant les éléments suivants :
- Exécuter des sous-processus sans fin (de manière asynchrone)
- Attendez t secondes
- Effectuer une autre tâche X pendant un certain temps
- Terminer les sous-processus
Idéalement, j'aimerais pouvoir différencier le stdout des sous-processus qui a été émis avant X de celui qui a été émis après X .
Quelques idées me viennent à l'esprit, même si je n'ai aucune idée de la façon dont je les mettrais en œuvre :
- Supprimer la sortie standard pour t secondes
- Insérez du texte (par exemple, "Tâche X démarrée") pour séparer visuellement les sections
- Diviser stdout en différents flux de sortie
Réponse acceptée :
Bien que vous puissiez compliquer les choses avec exec
et des querelles de descripteurs de fichiers supplémentaires, votre deuxième suggestion est la plus simple. Avant de commencer X , echo
une chaîne de marqueur dans le fichier journal.
Toutes ces commandes seraient ajoutées au même fichier, alors ce serait peut-être une bonne idée d'ajouter toutes les sorties de X avec un marqueur, afin que vous puissiez distinguer sa sortie de celle des commandes précédentes toujours en cours d'exécution. Quelque chose comme :
{ X; } | sed 's,^,[X say] ,'
Cela rendrait une analyse plus approfondie beaucoup plus simple. Ce n'est pas sûr et pour les programmes très verbeux, les conditions de concurrence se produiraient souvent.
Si vous êtes prêt à saisir l'occasion de casser une ligne de journal et que vous pouvez interrompre le premier lot d'applications sans conséquence, cela fonctionnera également :
{ Y; } >> log &
sleep $t
kill -STOP %% # last job, like the same as %1
echo -e "nX started" >> log
kill -CONT %%
{ X; } >> log2