tmux: mesclar todas as janelas como painéis

2

Eu inicio o GNU Parallel com o --tmux, o qual irá iniciar uma janela do tmux por job.

Eu gostaria de unir todas as janelas como painéis com o tamanho bem distribuído entre eles (como a visualização lado a lado: C-b M-5).

Eu tentei fazer:

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

Mas não distribui a altura uniformemente, resultando em:

create pane failed: pane too small

Existe uma maneira de dizer a uma janela para distribuir a altura uniformemente quando joinp ing ou uma maneira de unir todas as janelas como painéis e, em seguida, delimitá-las? Talvez algo usando select-layout tiled ?

Editar

Estou usando isso como o programa de teste:

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

O objetivo é ter os 9 trabalhos em execução mostrados em uma bela janela 3x3 ao anexar ao tmux. Quando um trabalho morrer, ele deve ser substituído pelo próximo trabalho.

Eu tentei:

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

Mas ainda dá:

can't find pane X

E não mantém todas as janelas como painéis na primeira janela ao anexar.

    
por Ole Tange 17.08.2016 / 20:28

2 respostas

1

Em vez de executar um comando separado, possivelmente em um loop, para mover os painéis depois que eles foram criados, você pode estender o comando de trabalho para que ele mova seu próprio painel na inicialização:

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

Isso mostrará os comandos adicionais do tmux (e, em seguida, sua saída, arranging in: tiled ) em cada painel. Para evitar isso, você poderia escrever um script wrapper, por exemplo.

#!/bin/sh

# move into the pane set
tmux joinp -t :0
tmux select-layout -t :0 tiled >/dev/null

# start the real task
sleep "$@"

E, em seguida, execute

seq 1000 | parallel --tmux --jobs 9 /path/to/wrapper.sh
    
por 18.08.2016 / 16:01
1

Sua sugestão select-layout está no caminho certo, mas precisa ser invocada depois que cada novo painel for criado. Todos os painéis são imediatamente reorganizados, então (no meu teste - um terminal 95x58) há espaço suficiente para a próxima divisão.

Para evitar a mensagem can't join a pane to its own window , é útil criar uma janela adicional, depois mover todas as janelas existentes para ela e finalizar o painel extra no final. parallel não é a ferramenta certa para isso - seria melhor você consultar as janelas em execução e mover cada uma delas em um loop:

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 

Como alternativa, você pode fazer com que cada novo painel tenha 1 linha de altura, com joinp -l 1 . Dependendo do tamanho do seu terminal, isso pode ser suficiente para apenas precisar do select-layout no final.

No entanto, parallel não controla as janelas / painéis tmux existentes e simplesmente inicia cada trabalho em uma nova janela. O antigo pode desaparecer, dependendo da configuração permanecer na saída . Então, depois de um tempo, a janela original (que mostrava cada trabalho em um painel) não conterá trabalhos em execução e todos os novos trabalhos estarão em suas próprias janelas novamente. Você terá que reexecutar o script para mover todas as janelas (e quaisquer painéis antigos) para uma única janela novamente.

    
por 17.08.2016 / 21:33

Tags