tmux 세션 인스턴스화 시간이 초과된 쉘에 다시 연결하는 예상 방법은 무엇입니까?

tmux 세션 인스턴스화 시간이 초과된 쉘에 다시 연결하는 예상 방법은 무엇입니까?

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
  • -ttmuxtty는 원격 측에 할당됩니다. 터미널이 필요합니다.
  • 이 명령은 (예: ) tmux에 대한 지원 으로 인해 작동합니다 . 이 옵션은 SSH 서버에서 명령 문자열을 전달하는 데 사용됩니다. "이 옵션은 로그인 쉘로 사용될 때의 호환성을 위한 것입니다"라고 말합니다. 물론.-csh -cman 1 tmuxsh(1)tmux

ssh user@server 'tmux ls'먼저 실행한 다음(이 작업을 수행할 필요 없음 ssh -t) 특정 세션에 연결할 수 있습니다( ssh -t … 'tmux a -t …').


tmux나는 그것을 로그인 쉘로 사용하는 것을 좋아하지 않습니다 . 이것이 내가 하는 방법이다:

  1. 내 공식 로그인 쉘은 입니다 /bin/bash. 서버의 로그인 쉘을 변경하려면 예를 들어 연결할 때 을 사용하십시오 chsh -s /bin/bash. /etc/shells(파일 확인을 위해 실행 ) cat /etc/shells에 나열된 쉘을 지정할 수 있습니다 .

  2. 그 다음에마지막에내 것은 .bashrc이것을 가지고 있습니다 :

    # run tmux if outside of tmux
    if [ -z "$TMUX"]; then
       tmux a || tmux
    fi
    

    ( .bashrcBash의 경우. 이 외의 쉘을 선택하는 경우 bash다른 파일을 변경해야 합니다.)

ssh컴퓨터로 이동 하면 (또는 어떤 방식으로든 로그인 셸을 실행하면) /bin/bash내 로그인 셸이기 때문에 실행됩니다. 부재를 감지 tmux하고 tmux a또는 를 실행합니다 tmux. tmux실행하려고 하면 bash실행됩니다.다른 /bin/bash. 쉘은 자신이 내부에 있음을 감지 tmux하고 다른 쉘을 실행하려고 시도하지 않습니다 tmux.

이것은 매우 잘 작동합니다. 나는 이것을 .bashrc시도하거나 수행하지 않으므로 내가 안에 있는 동안 쉘은 여전히 ​​실행 중입니다 . 이는 로그아웃하지 않고도 현재 tmux 세션을 종료하거나 분리할 수 있음을 의미합니다. 이렇게 하면 쉘에 들어가게 되며 원하는 경우 수동으로 다른 세션에 들어갈 수 있고, 새 세션을 시작하거나 작업이 없을 수도 있습니다. 이것은 제가 신중하게 고려한 디자인 선택이었습니다.exec tmux aexec tmuxtmuxtmux atmux

bash외부 쉘과 내부 쉘로 사용한다는 사실도 내 선택입니다. 일반적으로 말해서 이들은 다른 껍질일 수 있습니다. 선택한 외부 레이어에는 chsh. 다음을 지정하여 기본 내부 쉘을 선택할 수 있습니다.default-shell당신의 .tmux.conf:

default-shell path

기본 셸을 지정합니다. 이 default-command옵션을 비워두면 새 창의 로그인 셸로 사용되며 실행 파일의 전체 경로여야 합니다. 시작 시 첫 번째 적합한 환경 변수(shell by 또는 )에서 반환된 값에서 기본값을 설정하려고 시도합니다 tmux. 이 옵션은 로그인 셸로 사용될 때 구성되어야 합니다.SHELLgetpwuid(3)/bin/shtmux

내 설정에서는 창/창에서 로그인 셸을 사용하거나 사용 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

이러한 명령이 일부 스크립트나 별칭/함수에 포함되면 이것이 도움이 되기를 바랍니다.

관련 정보