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

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

Я впечатлен функциями удаленного управления 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он не будет запущен в приоритетном режиме: пользователю необходимо будет к нему подключиться.

решение1

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

решение2

Возможно, вам покажется более подходящим следующий альтернативный подход:

Вне tmux:

mkfifo fifo && tmux new -d '(echo foo;sleep 3) 9> fifo' && time cat fifo

Внутри tmux:

mkfifo fifo && tmux new-window '(echo foo;sleep 10) 9> fifo' && cat fifo 

Одним из отличий от . wait-forявляется то, что этот подход работает по принципу аварийного выключателя: он сработает, даже если по какой-то причине команда wait-for -Sтак и не будет выполнена.

Другое отличие состоит в том, что он будет ждать завершения всех дочерних процессов основного процесса (если только они явно не закроют другие файловые дескрипторы, что часто встречается в программах, пытающихся перейти в фоновый режим).

Объяснение: catкоманда будет ждать, пока что-то откроет другой конец FIFO, а затем выйдет, когдавсеЭкземпляры этого файлового дескриптора закрываются, что произойдет, когда все процессы, удерживающие его, завершатся. Эффект распространяется на дочерние процессы благодаря свойству файловых дескрипторов, что по умолчанию дочерние процессы наследуют открытые файловые дескрипторы родителя.

Связанный контент