webdevqa.jp.net

tmuxが再接続されない

私は最近、機能セットがもっと好きなので、screenの使用からtmux(macportsから取得)に切り替えました。ただし、スクリーニングできるように、tmuxを別の場所から再接続することができないようです。

Macの自宅で、iTerm2を開き、デフォルトのシェルはzshで、tmuxでtmuxセッションを開始します。私はすべての唾を吐き出し、適切なサーバーにSSH接続するなどして、しばらく作業します。仕事に行く時間です。 <C-a> d --tmuxがデタッチします。

私はWindowsXPマシンを使用して仕事に取り掛かります。 PuTTYを起動し、自宅のMacにSSHで接続し、tmux attachを試行すると、エラーメッセージが表示されます。

no sessions

なぜこれが起こるのか判断できないようです。私はこれを掘り下げることを恐れていませんが、どこから始めればよいのかさえわかりません。考え?

P.S. .tmux.confファイルをすでに削除しているので、デフォルトの設定を使用しています。

24
kenny

tmuxサーバーソケットをTMPDIR環境変数で指定されたディレクトリの下のディレクトリに格納します。

GUIセッションでは、おそらく/varの下のどこかを指すTMPDIRになります(例:/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/)。

SSH経由でログインすると、TMPDIRが設定されていない可能性があるため、tmux/tmp/でソケットを探します。

10.6システムでは、これが私のTMPDIRで、zsh/Terminal、およびzsh/SSHです。

% echo local: ${TMPDIR-unset}; ssh localhost 'echo remote: ${TMPDIR-unset}'
local: /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/
remote: unset

TMPDIRに使用する必要のある値がわかっている場合は、アタッチするとき(またはセッション自体の外部で他のtmuxコマンドを実行するとき)に指定できます。

TMPDIR=/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/ tmux attach

GUIセッションが使用していたディレクトリがわからない場合は、次のようなもので見つけることができる場合があります(構文はzshに固有です。/var/folders/で次の名前のディレクトリを検索します。 -Tmp-現在のユーザーが所有しています):

echo /var/folders/**/*/-Tmp-(U/)

将来の問題を回避するために、サーバーを起動する前にTMPDIRの設定を解除する(または、より簡単に予測できる設定に設定する)ことをお勧めします。

21
Chris Johnsen

私の場合、明らかに一時フォルダがクリーンアップされました。
このブログ投稿 「失われた」セッションを回復するのに役立ちました:

私はついに解決策を得ました:シグナル10を送信してtmuxにソケットを再作成させました。その後、セッションを失うことなくtmuxを再度実行できました。

$ killall -10 tmux
35
Dan Abramov

lsof-Uオプションは開いているソケットファイルを一覧表示するため、lsof -U | grep '^tmux'tmuxによって使用されているすべてのソケットを一覧表示します。 tmuxを開始したのと同じユーザーとしてログインしていない場合は、Sudoを使用する必要があります。

各行の最後の列はファイルの名前です。気になるファイルは/で始まります。

探している行は次のようになります。

tmux 1234  username 6u unix 0xffffffabcd123456 0t0 /private/var/folders/M8/M8tFwolmH08fOvJ+-35VI++++TM/-Tmp-/tmux-502/default
tmux 56789 username 6u unix 0xffffff123456789a 0t0 /private/tmp/tmux-502/default
6
Tyler Holien

lsofの提案にバリエーションがあり、TMPDIR変数を「回復」するためにある程度の成功を収めています。これは、多くの煩わしさを回避するのに役立ちます。利点は、lsofが返すものについてもう少し厳密になり、正しい値を解析しやすくなることです(ある時点で、いくつかの非定型文字がありますが、それでも有効です)。出力)。

簡単なワンライナーは次のとおりです。

$ lsof -Fn -d6 -aUc tmux | grep ^n | cut -c2-
/private/var/folders/_l/f_n8blps05xfnkw6fs3dcn_80000gp/T/tmux-502/default

私は次のスクリプトを使用します(〜/ .bash_profileまたは他の適切な場所にある関数である可能性もあります):

#!/bin/bash

if [[ -z "${TMPDIR}" ]]; then
  while read line; do
      case $line in
      n*) line="${line#n}"
          export TMPDIR="${line%%/tmux-$(id -u)/*}"
          ;;
      esac;
  done < <(lsof -Fn -d6 -aUc tmux)
else
    echo ">> \$TMPDIR already defined: $TMPDIR" 1>&2
fi

https://Gist.github.com/jps3/769d50a6a7611949473b

1
jps3