Faire un bloc tmux jusqu'à la fin du programme

8

Je suis impressionné par les fonctionnalités de télécommande de tmux:

tmux new-window -t p12346 'echo foo;sleep 10' 

Cela crée une nouvelle fenêtre dans la session nommée p12346 et n'imprime rien à l'écran. C'est super. Mais comment dire à la commande ci-dessus d'attendre la fin du sommeil avant de revenir? C'est-à-dire que je veux que cela fasse la même chose mais que cela prenne 10 secondes pour s'exécuter:

time tmux new-window -t p12346 'echo foo;sleep 10' 

Contexte

Si cela est viable, cela pourrait devenir une fonctionnalité de GNU Parallel: les travaux en cours d'exécution peuvent être consultés au fur et à mesure de leur fenêtre tmux, afin que vous puissiez suivre la progression de chaque travail en temps réel.

Il tmuxne sera donc pas exécuté au premier plan: l'utilisateur devra s'y attacher.

Ole Tange
la source

Réponses:

8

tmux 1.8 a introduit la wait-forcommande qui peut vous aider à faire ce que vous voulez:

time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
          wait-for p12346-neww-done

Le nom du «canal» ( p12346-neww-donedans l'exemple ci-dessus) peut être tout ce que vous aimez (tant qu'il est le même aux deux endroits; si vous prévoyez plusieurs invocations potentiellement simultanées, vous voudrez probablement aussi utiliser une valeur unique pour chaque invocation ). La partie importante est que vous «attendez» le signal après la new-windowcommande (en tant que partie de la même commande tmux , donc le point-virgule échappé: tmux doit le traiter, pas le shell) et envoyer le signal comme dernière étape de la commande de la fenêtre.

Si vous devez être un peu plus robuste contre votre séquence de commandes avortant de manière moche ou incommode, alors vous pouvez essayer d'utiliser un piège shell pour envoyer le signal (réarrangé un peu pour la lisibilité (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Chris Johnsen
la source