Сделать блок tmux до завершения программы

8

Я впечатлен возможностями дистанционного управления tmux:

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

Это создает новое окно в сеансе с именем p12346 и ничего не печатает на экране. Это великолепно. Но как я могу сказать вышеприведенной команде подождать, пока сон закончится, прежде чем вернуться? Т.е. я хочу сделать то же самое, но выполнить 10 секунд:

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

Фон

Если это жизнеспособно, то это может стать функцией GNU Parallel: доступ к выполняемым в данный момент заданиям возможен по мере прохождения каждого их окна tmux, поэтому вы можете следить за ходом выполнения каждого задания в режиме реального времени.

Так tmuxчто не будет запускаться на переднем плане: пользователь должен будет присоединиться к нему.

Оле Танге
источник

Ответы:

8

В tmux 1.8 введена wait-forкоманда, которая может помочь сделать то, что вы хотите:

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

Имя «канала» ( p12346-neww-doneв приведенном выше примере) может быть любым, если вам угодно (при условии, что оно одинаково в обоих местах; если вы ожидаете несколько потенциально одновременных вызовов, то вы, вероятно, также захотите использовать уникальное значение для каждого вызова). ). Важной частью является то, что вы «ждете» сигнала после new-windowкоманды (как часть той же команды tmux , таким образом, экранированная точка с запятой: tmux должна обрабатывать ее, а не оболочка) и отправлять сигнал как последний шаг команда окна.

Если вам нужно быть немного более устойчивым к последовательности команд, которая прерывается уродливым или неудобным способом, то вы можете попробовать использовать ловушку оболочки для отправки сигнала (немного переставил для удобства чтения (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Крис Джонсен
источник