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 для получения дополнительной информации и других файлов запуска.