Intereting Posts
Аудио / видео не синхронизируется при воспроизведении MP4 в mplayer Настроить vim's: сделать, чтобы переключаться или открывать вкладки при ошибке У меня есть команда, не найденная ошибка в моем скрипте оболочки, когда я запускаю код Запуск GIMP должным образом? Почему первые 1024 порта ограничены только пользователем root? Apache не прослушивает порт 443 установить скорость бод для tty Где управляющая страница программиста для открытой функции C? «Трудносвязанные» части большого файла, в котором только небольшая часть изменилась Vim: присоедините линии, заменив ^ M Как установить пользовательский размер по умолчанию для новых окон терминала XFCE? почему kjournald использует так много пишет? Получить текст между словом и последней строкой? Как я могу создать резервную копию каталога в NTFS, сохраняя атрибуты файлов Unix? Как я могу проверить, являются ли файлы конфигурации nginx действительными в скрипте Bash?

tmux: объединить все окна как панели

Я запускаю GNU Parallel с —tmux, который запустит окно tmux для каждого задания.

Я хотел бы объединить все окна в виде панелей с размером, красиво распределенным между ними (например, черепичный вид: Cb M-5).

Я пробовал делать:

seq 15 | parallel tmux -S /tmp/tmsF8j3K joinp -s {} -t 1 

Но он не распределяет высоту равномерно, в результате чего:

 create pane failed: pane too small 

Есть ли способ сказать окну равномерно распределить высоту при joinp или способ присоединиться ко всем окнам в виде панелей, а затем их черепицей? Может быть, что-то, использующее select-layout tiled ?

редактировать

Я использую это как тестовую программу:

 seq 1000 | parallel --jobs 9 --tmux sleep 

Цель состоит в том, чтобы 9 рабочих заданий отображались в хорошем окне 3×3 при подключении к tmux. Когда одна работа умирает, ее следует заменить следующей работой.

Я пытался:

 while [ -e "$SERVER" ] ; do top=$(tmux -S $SERVER new-window -P -n all) tmux -S $SERVER list-panes -a | grep -v "^$top" | cut -d':' -f1-2 | while read p ; do tmux -S $SERVER joinp -s $p -t $top tmux -S $SERVER select-layout tiled done tmux -S $SERVER kill-pane -t $top tmux -S $SERVER select-layout tiled sleep 1 done 

Но он все равно дает:

 can't find pane X 

И не прикрепляет все окна как панели в первом окне при прикреплении.

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

 seq 1000 | parallel --jobs 9 --tmux tmux joinp -t :0 \; \ tmux select-layout -t :0 tiled \; \ sleep 

Это покажет дополнительные команды tmux (а затем их вывод, arranging in: tiled ) в каждой панели. Чтобы этого избежать, вы можете написать сценарий оболочки, например.

 #!/bin/sh # move into the pane set tmux joinp -t :0 tmux select-layout -t :0 tiled >/dev/null # start the real task sleep "$@" 

А затем запустите

 seq 1000 | parallel --tmux --jobs 9 /path/to/wrapper.sh 

Ваше предложение select-layout находится по правильному пути, но его нужно вызвать после создания каждой новой панели. Все панели сразу же реорганизуются, поэтому (в моем тесте – терминал 95×58) достаточно места для следующего разделения.

Чтобы избежать can't join a pane to its own window сообщению, это помогает создать дополнительное окно, а затем переместить все существующие окна в это и закончить дополнительную панель в конце. parallel не является подходящим инструментом для этого – вам будет лучше опросить запущенные окна и перемещать их в цикле:

 top=$(tmux -S $SERVER new-window -P -n all) tmux -S $SERVER list-panes -a | grep -v "^$top" | grep -o "%[0-9]\+\>" | while read p ; do tmux -S $SERVER joinp -s $p -t $top tmux -S $SERVER select-layout tiled done tmux -S $SERVER kill-pane -t $top tmux -S $SERVER select-layout tiled 

В качестве альтернативы вы можете сделать каждую новую высоту линии 1 с помощью joinp -l 1 . В зависимости от размера вашего терминала этого может быть достаточно, чтобы в конце был нужен только один select-layout .

Однако parallel не отслеживает существующие окна / панели tmux и просто запускает каждое задание в новом окне. Старый может исчезнуть, в зависимости от настройки останова на выходе . Поэтому через некоторое время исходное окно (которое показывает каждое задание в панели) не будет содержать заданий, и все новые задания будут снова появляться в их собственных окнах. Вам придется перезапустить скрипт, чтобы снова переместить все окна (и любые старые панели) в одно окно.