tmux 세션을 사용하는 경우쉘 인스턴스화의 일부로 호출됨, 사용자가 SSH를 통해 시스템에 연결할 때마다 새 세션이 생성됩니다. 연결이 끊어지면(예: 세션 시간 초과) 세션이 계속 존재하지만 다시 연결되면 이전 세션에 연결되지 않고 새 세션이 계속 생성됩니다. 이전 세션을 다시 연결하거나 관리하는 예상 방법은 무엇입니까?
배경
내부에RHEL 8 스틱, 하나 있어요발견하다이를 위해서는 "셸이 초기화될 때 자동으로 시작되는 세션 제어"가 필요합니다. STIG에서 이를 수행하는 방법은 로그인 시 tmux를 시작하는 것입니다. 또한 다음을 유발하는 다른 컨트롤도 있습니다.활동 후 tmux 세션이 잠겼습니다., 그리고비활성 후 SSH 연결 끊기. 내 STIGed 시스템에서는 기본 개발 시스템 외에도 인과 테스트를 실행했는데 유휴 시간 초과가 많이 발생하여 독립적인 세션도 많이 발생했습니다.
시간 초과 세션 예시
[user@system ~]$ tmux list-sessions
0: 1 windows (created Tue Jun 15 14:09:29 2021) [202x47]
1: 1 windows (created Tue Jun 15 14:32:53 2021) [202x47]
10: 1 windows (created Wed Jun 16 10:34:15 2021) [202x47]
11: 1 windows (created Wed Jun 16 10:50:04 2021) [202x47] (attached)
3: 1 windows (created Tue Jun 15 15:11:01 2021) [202x47]
4: 1 windows (created Tue Jun 15 16:47:34 2021) [202x47]
5: 1 windows (created Tue Jun 15 16:50:10 2021) [80x24]
6: 1 windows (created Tue Jun 15 18:22:36 2021) [202x47]
7: 1 windows (created Wed Jun 16 09:41:14 2021) [202x47]
8: 1 windows (created Wed Jun 16 09:52:56 2021) [202x47]
9: 1 windows (created Wed Jun 16 10:14:31 2021) [202x47]
이 문제를 어떻게 처리했습니까?
그 중 하나에 다시 연결하려고 하면 다음과 같은 경고가 표시됩니다.
[user@system ~]$ tmux attach-session -t 0
sessions should be nested with care, unset $TMUX to force
값을 설정 해제하고 세션을 다시 연결하면 이제 세션이 중첩되어 상황이 매우 복잡해집니다. 이론적으로는 이 중첩 세션에서 수행 중인 작업을 수행할 수 있지만 더 나은 방법이 있어야 할 것 같습니다. 완료되기 전에 다시 분리한 다음 이전 세션에 다시 연결해야 한다면 이제삼회의는 얼마나 깊은가요?
노트: 저는 RHEL 8 STIG가 구현된 환경을 테스트하고 익히기 위해 이 시스템을 사용하고 있습니다. 프로덕션 시스템에서 사용자가 환경을 더 잘 인식하고 세션 유휴 시간 초과 가능성이 줄어들기를 바랍니다. 사용 사례에 따라 시간 초과를 비활성화할 수 있지만 STIG 규칙을 준수하려고 합니다.
답변1
나추측하다tmux
이는 로그인 셸 때문에 발생합니다 . SSH를 통해 연결할 때마다 tmux
새로운 프로세스가 시작됩니다. 기본적으로 tmux
새 세션이 생성됩니다.
연결되면 요청 시 실행 가능 tmux a
:
# from the outside
ssh -t user@server 'tmux a || tmux'
노트:
tmux a || tmux
나는 실패할 경우(예: 연결할 이전 세션이 없는 경우) 새 세션을 생성하도록 사용했습니다 .tmux a
-t
tmux
tty는 원격 측에 할당됩니다. 터미널이 필요합니다.- 이 명령은 (예: )
tmux
에 대한 지원 으로 인해 작동합니다 . 이 옵션은 SSH 서버에서 명령 문자열을 전달하는 데 사용됩니다. "이 옵션은 로그인 쉘로 사용될 때의 호환성을 위한 것입니다"라고 말합니다. 물론.-c
sh -c
man 1 tmux
sh(1)
tmux
ssh user@server 'tmux ls'
먼저 실행한 다음(이 작업을 수행할 필요 없음 ssh -t
) 특정 세션에 연결할 수 있습니다( ssh -t … 'tmux a -t …'
).
tmux
나는 그것을 로그인 쉘로 사용하는 것을 좋아하지 않습니다 . 이것이 내가 하는 방법이다:
내 공식 로그인 쉘은 입니다
/bin/bash
. 서버의 로그인 쉘을 변경하려면 예를 들어 연결할 때 을 사용하십시오chsh -s /bin/bash
./etc/shells
(파일 확인을 위해 실행 )cat /etc/shells
에 나열된 쉘을 지정할 수 있습니다 .그 다음에마지막에내 것은
.bashrc
이것을 가지고 있습니다 :# run tmux if outside of tmux if [ -z "$TMUX"]; then tmux a || tmux fi
(
.bashrc
Bash의 경우. 이 외의 쉘을 선택하는 경우bash
다른 파일을 변경해야 합니다.)
ssh
컴퓨터로 이동 하면 (또는 어떤 방식으로든 로그인 셸을 실행하면) /bin/bash
내 로그인 셸이기 때문에 실행됩니다. 부재를 감지 tmux
하고 tmux a
또는 를 실행합니다 tmux
. tmux
실행하려고 하면 bash
실행됩니다.다른 /bin/bash
. 쉘은 자신이 내부에 있음을 감지 tmux
하고 다른 쉘을 실행하려고 시도하지 않습니다 tmux
.
이것은 매우 잘 작동합니다. 나는 이것을 .bashrc
시도하거나 수행하지 않으므로 내가 안에 있는 동안 쉘은 여전히 실행 중입니다 . 이는 로그아웃하지 않고도 현재 tmux 세션을 종료하거나 분리할 수 있음을 의미합니다. 이렇게 하면 쉘에 들어가게 되며 원하는 경우 수동으로 다른 세션에 들어갈 수 있고, 새 세션을 시작하거나 작업이 없을 수도 있습니다. 이것은 제가 신중하게 고려한 디자인 선택이었습니다.exec tmux a
exec tmux
tmux
tmux a
tmux
bash
외부 쉘과 내부 쉘로 사용한다는 사실도 내 선택입니다. 일반적으로 말해서 이들은 다른 껍질일 수 있습니다. 선택한 외부 레이어에는 chsh
. 다음을 지정하여 기본 내부 쉘을 선택할 수 있습니다.default-shell
당신의 .tmux.conf
:
default-shell path
기본 셸을 지정합니다. 이
default-command
옵션을 비워두면 새 창의 로그인 셸로 사용되며 실행 파일의 전체 경로여야 합니다. 시작 시 첫 번째 적합한 환경 변수(shell by 또는 )에서 반환된 값에서 기본값을 설정하려고 시도합니다tmux
. 이 옵션은 로그인 셸로 사용될 때 구성되어야 합니다.SHELL
getpwuid(3)
/bin/sh
tmux
내 설정에서는 창/창에서 로그인 셸을 사용하거나 사용 default-shell
하지도 않습니다 . tmux
하지만 tmux
이것이 내 로그인 셸 자체라면 이를 지정해야 합니다 default-shell
(아마도 이것이 현재 작동하는 방식일 것입니다).
답변2
다른 세션으로 이동하기 위한 키보드 단축키는 ctrlb+ (또는 ctrlb+ 입니다 ).
해당 명령은 not 이지만 attach-session
설명서의 설명 방식이 오해의 소지가 있는 것 같습니다(굵은 글씨는 오해의 소지가 있음).
attach-session [-dErx] [-c working-directory] [-t target-session]
(별칭: 첨부)tmux 외부에서 실행하는 경우 현재 터미널에 새 클라이언트를 생성하고 이를 대상 세션에 연결합니다. 내부에서 사용하는 경우 현재 클라이언트를 전환하세요.
이에 상응하는 것은 실제로 switch-client
클라이언트의 세션을 전환할 수 있다는 것입니다(예: 이미 연결된 동안).
switch-client [-Elnpr] [-c target-client] [-t target-session] [-T key-table]
(별칭: 스위치c)클라이언트 target-client의 현재 세션을 target-session으로 전환합니다.
고객이 지정되지 않은 경우 현재 고객입니다.
따라서 수동으로 로그인한 후 먼저 현재 세션 ID를 어딘가에 저장할 수 있습니다.
tmux display-message -p '#S' > /tmp/sessiontokill
아니요, 변수는 #{client_last_session}
다음 전환 직후에 이 값을 사용합니다.
대상 세션으로 전환합니다.
tmux switch-client -t 0
그리고 시간이 지나도 누적되지 않도록 현재 쓸모없고 사용되지 않는 이전 세션을 종료합니다.
tmux kill-session -t "$(tmux display-message -p '#{client_last_session}')"
여전히 동일한 세션을 사용하는 하나 이상의 클라이언트가 있는 경우(예: 일부 네트워크 오류로 인해) 다음을 수행하여 해당 클라이언트를 모두 제거할 수 있습니다.
- 이 세션을 사용하는 클라이언트 목록 찾기
- 목록에서 현재 클라이언트 제거
- 다른 모든 클라이언트를 분리(+ -HUP)
.
for i in $(tmux list-clients -F '#{client_name}' -t "$(tmux display-message -p '#S')" | grep -Fvx "$(tmux display-message -p '#{client_name}')"); do
tmux detach-client -P -t "$i"
done
이러한 명령이 일부 스크립트나 별칭/함수에 포함되면 이것이 도움이 되기를 바랍니다.