mosh:两次使用不同的PID来源.bashrc

时间:2014-07-24 01:08:22

标签: bash tmux mosh

我在构建服务器中使用tmux。最近我编写了一个小的.bashrc脚本,如果退出,它将自动附加到tmux会话。该脚本如下所示

# 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 

问题是每当我ssh使用mosh它只是挂在tmux窗口内。我发现如果我删除这个脚本然后使用mosh ssh并手动附加到tmux那么我就不会遇到这个问题了。如果我将上述脚本放在.bashrc中,则只会出现此问题。

我怀疑mosh正在等待.bashrc完成并无限期地等待它,同时它也没有将鼠标和按键控制传递给tmux。我通过从另一个终端终止tmux会话来确认这一点,并发现mosh已恢复并尝试执行我之前缓冲的击键。

奇怪的是mosh如何设法跨越ps -o comm= -p $PPID == "sshd"支票。这是因为对于mosh,shell的进程名称为bash,而shell的父进程名称为mosh-server而不是sshd。进一步调查显示,mosh执行.bashrc两次sshd,一次mosh-server。这可以通过将ps -o comm= -p $PID -p $$ >> moshbash放入.bashrc来重现。我的tmux attach发生在sshd并且永远挂起mosh

我发现的一个简单的解决方法是

  

mosh user @ server - tmux attach -t`whoami`

我也可以对我的ssh做类似的事情,从客户端发出命令并完全取消.bashrc脚本,但我不希望将服务器端自动化溢出到客户端。

实际上mosh似乎并没有错。它每个PID只发送一个.bashrc文件。我认为.bashrc阻塞会话tmuxtmux是一个糟糕的设计,因为&也需要终端我们不能开始作为后台进程,因此{{1}}也不会工作。 有没有其他办法解决这个问题?我想如果我们可以在设置sshd的mosh客户端和设置sshd的ssh客户端之间进行distingushh,那么可以使用信息。

1 个答案:

答案 0 :(得分:2)

.bashrc总是在每次交互式非登录bash实例化时执行,因此请使用.bash_profile,以便在登录ssh时只运行一次。如果脚本的脚本或进程传唤bash,则会导致重复召唤。

有关详细信息和其他启动文件,请参阅Bash Startup Files