2014-07-24 10 views
1

내 빌드 서버에 tmux을 사용합니다. 최근에는 작은 .bashrc 스크립트를 작성하여 종료 할 경우 세션을 tmux에 연결하는 작업을 자동화합니다. 나는 ssh 그것이 바로 TMUX 창 내부에 달려 mosh을 사용할 때마다 문제가mosh : 서로 다른 PID로 두 번 소스 .bashrc

# Automate tmux Startup                                              
if [ -z "$TMUX" ]; then                                              
    # we're not in a tmux session                                           
    if [ `ps -o comm= -p $PPID` == "sshd" ]; then                                        
     # even VNC can have $SSH_TTY and $SSH_CONNECTION set so we cant find out                                
     # if we want to attach to tmux during ssh so we need to see if parent                                
     # process is sshd see                                                                         
     # http://unix.stackexchange.com/questions/145780/linux-ssh-connection-is-set-even- without-sshing-to-the-server                      
     # Only attach to tmux if its me                                          
     WHOAMI=$(whoami)                                              
     if tmux has-session -t $WHOAMI 2>/dev/null; then                                      
      tmux -2 attach-session -t $WHOAMI                                                                           
     else                                                 
      echo "Start tmux with username as session name 'tmux new -s $WHOAMI' "                               
     fi                                                 
    fi #parent process check                                             
else                                                   
    echo "Inside tmux"                                              
fi 

을 다음과 같이 스크립트 보인다. 이 스크립트를 제거한 후 mosh를 사용하여 수동으로 tmux에 연결하면이 문제가 발생하지 않습니다. 위의 스크립트를 .bashrc에 넣으면이 문제가 발생합니다.

내 생각에 mosh는 .bashrc이 완료 될 때까지 기다리고 있으며 무한정 기다리고 있으며 마우스와 키스트 로크 컨트롤을 tmux으로 전달하지 않습니다. 다른 터미널에서 tmux 세션을 종료하여이 사실을 확인한 결과 mosh이 복구되었고 이전에 버퍼링 된 키 입력을 실행하려고 시도했습니다.

이상한 점은 mosh이 (가) ps -o comm= -p $PPID == "sshd" 수표를 통과 한 것입니다. 이는 mosh의 경우 쉘의 프로세스 이름이 bash이고 쉘의 상위 프로세스 이름이 mosh-server이고 sshd이 아니기 때문입니다. 추가 조사에 따르면 moshsshd으로 .bashrc을 두 번 한 번 실행하고 mosh-server으로 한 번 실행하는 것으로 나타났습니다. 이것은 을 .bashrc에 넣음으로써 재현 가능합니다. tmux attachsshd에서 일어나고 mosh은 영원히 걸려있었습니다.

내가 찾은 간단한 해결 방법은

MOSH 사용자 @ 서버를 수행하는 것이 었 - '-t 첨부 TMUX

나는 화재뿐만 아니라 내 SSH와 비슷한 일을 할 수 whoami` 명령을 클라이언트 측에서 제거하고 .bashrc 스크립트를 모두 없애면 클라이언트 측에 서버 측 자동화를 넘겨주고 싶지 않습니다.

사실 mosh은 잘못한 것 같습니다. PID 당 한 번만 .bashrc 파일을 소싱합니다. tmux에 대한 차단 세션을 실행하는 것은 나쁜 설계라고 생각합니다. tmux도 터미널을 필요로하므로 백그라운드 프로세스로 시작할 수 없으므로 &도 작동하지 않습니다. 이 문제를 해결하는 다른 방법이 있습니까? 나는 정보를 사용할 수있는 SSHd를 설정하는 sshd와 ssh 클라이언트를 설정하는 mosh 클라이언트 사이에 distingusih가있을 수 있다고 생각한다.

답변

2

.bashrc 항상 대화 형 비 로그인 bash가 인스턴스화 될 때마다 실행되므로 대신 .bash_profile을 사용하십시오. 그러면 로그인 할 때 한 번만 실행됩니다. 스크립트의 스크립트 또는 프로세스가 bash를 소환하면 반복 소환이 발생합니다.

자세한 내용 및 기타 시작 파일은 Bash Startup Files을 참조하십시오.