tmux:すべてのウィンドウをウィンドウにマージする

tmux:すべてのウィンドウをウィンドウにマージする

各タスクに対して tmux ウィンドウを起動する --tmux を使用して GNU Parallel を起動します。

すべてのウィンドウをサイズよく分散したウィンドウに結合したいです(例:タイルビュー:Cb M-5)。

私はこれを試みます:

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

ただし、高さが均等に分配されないため、次のような結果が発生します。

create pane failed: pane too small

joinping時にウィンドウに高さを均等に分配するように指示するか、すべてのウィンドウをウィンドウに接続してからタイリングするように指示する方法はありますか?たぶんどんな用途に使われますかselect-layout tiled

編集する

私はこれをテストプログラムとして使用します。

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

目標は、tmuxに接続したときに素晴らしい3x3ウィンドウに実行されている9つのタスクを表示することです。ジョブが終了したら、次のジョブに置き換える必要があります。

私は試した:

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

そして、接続するとき、すべてのウィンドウを最初のウィンドウのウィンドウとして保持するわけではありません。

答え1

ウィンドウを作成した後、ウィンドウを移動するために別のコマンド(おそらくループ内)を実行するのではなく、起動時に自分のウィンドウを移動するように作業コマンドを拡張できます。

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

arranging in: tiledこれにより、各ウィンドウに異なるtmuxコマンド(および対応する出力)が表示されます。これを防ぐために、ラッパースクリプトを作成できます。

#!/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

答え2

あなたのselect-layout提案は正確ですが、新しいウィンドウが作成されるたびに呼び出す必要があります。すべてのウィンドウはすぐに再構成されるため(私のテストでは95x58端末)、次の分割に十分なスペースがあります。

この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ウィンドウ/ウィンドウは追跡されず、各タスクは新しいウィンドウで開始されます。状況によっては、古いものが消えることがあります。終了時に未変更のまま環境。したがって、一定時間が経過すると、元のウィンドウ(各タスクがウィンドウに表示されます)に実行中のタスクは含まれず、すべての新しいタスクが独自のウィンドウに再表示されます。すべてのウィンドウ(および前のウィンドウ)を単一のウィンドウに戻すには、スクリプトを再実行する必要があります。

関連情報