mosh: исходники.bashrc дважды с разными PID

Я использую 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, чтобы просто подключиться к tmux и вручную подключить его к tmux, я не столкнусь с этой проблемой. Эта проблема возникает только в том случае, если я поместил вышеуказанный скрипт в .bashrc,

Я подозреваю, что Моша ждет .bashrc завершить и ждет его бесконечно, и в то же время он также не передает управление мышью и нажатием клавиши на tmux, Я подтвердил это, убив tmux сеанс с другого терминала и обнаружил, что mosh восстановил и попытался выполнить мои ранее буферизованные нажатия клавиш.

Странно то, что как mosh удалось пересечь ps -o comm= -p $PPID == "sshd" проверять. Это потому что для mosh Имя процесса оболочки bash и имя родительского процесса оболочки mosh-server и не sshd, Дальнейшее расследование показало, что mosh исполняет .bashrc дважды один раз sshd и как только mosh-server, Это воспроизводимо, если положить ps -o comm= -p $PID -p $$ >> moshbash в .bashrc.My tmux attach происходило в sshd и висит mosh навсегда.

Я нашел простой обходной путь:

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

Я могу сделать то же самое, что и мой ssh, чтобы запустить команду со стороны клиента и полностью исключить скрипт.bashrc, но я не хочу перетекать свою автоматизацию на стороне сервера на сторону клиента.

На самом деле mosh не похоже, что это не так. Это источник .bashrc файл только один раз на PID . Я думаю, что это плохой дизайн .bashrc начало сеанса блокировки tmux поскольку tmux также нужен терминал, мы не можем начать как фоновый процесс либо так & также не будет работать. Есть ли другой способ обойти эту проблему? Я думаю, что если мы сможем дистанцировать между клиентом mosh, устанавливающим sshd, и клиентом ssh, устанавливающим sshd, эта информация может быть использована.

1 ответ

Решение

.bashrc всегда выполняется каждый раз, когда инстанцируется интерактивный bash без входа в систему, поэтому используйте .bash_profile вместо этого он будет запускаться только один раз при входе в систему по ssh. Если скрипт или процессы скрипта вызывают bash, это вызовет повторный вызов.

Смотрите Bash Startup Files для получения дополнительной информации и других файлов запуска.

Другие вопросы по тегам