이전 글:
2021.04.26 - [잡기술/Ubuntu] - 티먹스 tmux 사용해서 터미널 여러 개 띄우기 (1)
2021.04.28 - [잡기술/Ubuntu] - 티먹스 tmux 사용해서 터미널 여러 개 띄우기 (2) - 스크롤, .tmux.conf
tmux의 가장 멋진 기능 중 하나는 원격으로 session을 연결해서 작업할 수 있다는 것이다.
예를 들어 연구실 컴퓨터에 tmux session을 만들어서 작업하다가,
집에 가서 해당 session에 연결하면 연구실에서 보던 똑같은 터미널 화면을 즉각 내 컴퓨터에도 띄울 수 있다.
심지어 동기화 속도도 거의 실시간이라 (별로 실용성은 없다.)
내 컴퓨터를 통해 해당 세션에서 작업을 수행하면 모든 것이 바로 연구실 컴퓨터에 반영된다.
어떻게 보면 터미널판 팀뷰어라고도 볼 수 있는데,
터미널 사용을 조금 공부하고 tmux를 도입한 뒤로 팀뷰어 사용이 확 줄었다.
(요즘은 아예 사용하지 않는다.)
적당히 남은 작업을 하다가 터미널을 끄고, 나머지를 연구실에 가서 하든, 그 반대로 하든 선택은 자유.
(물론 요즘은 집에서 일을 거의 안 한다 ㅎㅎ)
연구실 컴퓨터에서 가동되고 있는 session 이름을 알면,
이전에 설명한 것처럼 어느 터미널에서나 해당 session과 연결이 가능하다.
$ tmux attach -t SESSION_NAME
당연히 SESSION_NAME은 session 이름. 기본은 0이다.
그런데 기존 session이 화면에 떠있는 상태에서 새로운 session을 연결할 때,
터미널의 크기가 맞지 않으면 렌더링이 깔끔하게 되지 않는다.
큰 문제가 아닐 수도 있지만, tqdm 같은 정밀하게 터미널을 조작하는 코드가 있는 경우 사정없이 깨져버린다.
또, Windows에서 WSL을 통해 크기가 맞지 않는 session에 접속하면 아래 화면처럼 점박이가 나오고,
종종 터미널의 일부가 가리는 상황이 발생한다.
아래 명령어로 기존에 연결되어 있는 session들을 모두 detach 하고, 현재 화면에서만 해당 session을 렌더링 한다.
$ tmux attach -t SESSION_NAME -d
누가 봐도 -d는 detach라는 뜻이다.
집에서 해당 명령을 실행하면, 연구실 컴퓨터에 떠있는 tmux session이 꺼진다.
하지만 session 자체가 사라지지는 않기 때문에, 집에서 원하는 만큼 작업을 하고, 터미널을 종료한 뒤에
연구실에서 다시 attach를 하면 언제든지 작업 재개가 가능하다.
멋진 점이 있으면 귀찮은 부분도 있는 법.
내가 느꼈던 가장 큰 귀찮은 부분은 컴퓨터를 재부팅할 때마다 window, pane을 다 새로 만들어줘야 한다는 점이다.
보통 5~6개의 window를 띄워놓고,
각 window마다 많게는 4개씩 pane을 쓰며
각 pane은 서로 다른 서버들에 연결되어 있으므로
컴퓨터를 재부팅하라는 알림이 나오면 스트레스를 받게 된다.
이러한 번거로움을 해소하기 위해 몇 가지 함수들을 만들었다.
2021.04.24 - [잡기술/Ubuntu] - 터미널에서 함수 사용하기
터미널에서 함수 사용하기
웬만하면 파이썬 스크립트 내에서 반복적인 작업들을 해결할 수 있지만 가끔 어떤 main.py 파일을 한두개의 argument만 조금 바꿔서 반복적으로 실행해야 하는 경우가 있다. 예를 들자면 요즘 arbitrar
sanghyun.tistory.com
#!/bin/bash
divide_two()
{
tmux split-window -h
}
divide_four()
{
tmux split-window -h
tmux split-window -v -t 0
tmux split-window -v -t 2
}
split-window는 -h와 함께 쓰이면 현재 window를 좌우, -v와 함께 쓰이면 상하로 분할한다.
-t N 을 추가하면 N번 pane에 대해서 해당 명령을 실행한다.
- pane 인덱스 확인하기.
prefix - q - 현재 선택된 pane 분할. -h는 좌우, -v는 상하. -t N 으로 target pane을 지정 가능.
tmux split-window {-h or -v}
따라서 divide_two의 경우 현재 window를 좌우로 분할한다.
divide_four 같은 경우 현재 window를 우선 좌우로 분할하고, 0번 pane을 상하로 분할한다.
그런데 pane 인덱스의 경우 고정이 아니고, pane이 생성됨에 따라서 유동적으로 변한다.
따라서 우측 pane은 2번이 되며 2번 pane을 상하로 분할해서 총 4개의 pane을 만들게 된다.
divide_four가 실행된 직후의 화면은 아래와 같다.
다음은 login_all 함수인데, 이 함수가 필요한 배경을 우선 좀 짚어야 한다.
tmux에서 새로운 pane이나 window를 만들면, 해당 session이 실행 중인 컴퓨터의 ~/ directory가 기본으로 열린다.
그렇기 때문에 만약 어떤 pane을 특정 서버의 ssh 연결을 위해 쓰고 있는데,
같은 window에 새로운 pane을 만든다고 해도 그 pane은 ssh에 연결된 서버가 아닌 현재 컴퓨터의 ~/ 을 보여준다.
뭔가 주저리주저리 복잡해졌지만, 아무튼 pane이 n개 있으면 ssh 연결도 n번 해야 한다는 것.
그러면 tmux는 window를 늘어놓는 용도로만 쓰고, 각 window에는 하나의 pane으로 서버에 연결한 뒤
해당 서버에서 tmux를 다시 띄우면 화면 분할을 조금 더 편하게 할 수 있지 않을까?
아쉽게도 prefix는 가장 바깥, 즉 현재 컴퓨터에서 실행 중인 tmux session에만 전달된다.
서버와 현재 컴퓨터의 prefix를 서로 다른 것으로 정의하면 혹시 모르겠지만,
그렇게까지 복잡한 커맨드를 외우면서 작업 환경을 세팅하고 싶지는 않다.
대신에 그냥 한방에 로그인을 많이 할 수 있는 함수를 만들었다.
login_all()
{
local pane=0
while [ $pane -le $(($2-1)) ]
do
tmux select-pane -t $pane
tmux send-keys "ssh $1"
tmux send-keys ENTER
pane=$(($pane+1))
done
}
htop_nvidia()
{
tmux select-pane -t 0
tmux resize-pane -x 80 -y 20
tmux send-keys "htop"
tmux send-keys ENTER
tmux select-pane -t 1
tmux send-keys "watch -n 0.2 nvidia-smi"
tmux send-keys ENTER
}
login_all은 두 개의 인수를 받는데, 하나는 ~/.ssh/config에 지정한 서버 이름 ($1)이고
2021.04.23 - [잡기술/Ubuntu] - SSH 쉽게 사용하기 (1) - .ssh/config
SSH 쉽게 사용하기 (1) - .ssh/config
현재 연구실 작업 환경이 [로컬 + 연구실 서버]를 중심으로 되어 있어, ssh 접속을 굉장히 자주 사용하게 된다. 하지만 이를 위해 접속 IP나 도메인을 매 번 입력해 주는 것은 번거로우며, 기억하기
sanghyun.tistory.com
나머지 하나는 로그인할 pane의 개수 ($2)다.
예) login_all my_server 4
기본적으로 $2번만큼 반복하는 while 문법이며,
- N번 pane 선택.
select-pane -t N - 현재 선택된 pane에 STRING 입력.
send-keys "STRING" - 현재 선택된 pane에 COMMAND를 입력.
send-keys COMMAND
을 잘 조합해서 만들었다.
풀어서 쓰면 각 pane마다 ssh 접속 명령어를 입력하고 ENTER를 치는 것을 반복하는 형식이라고 보면 된다.
내친김에 왼쪽 pane 2개에 htop과 nvidia-smi도 자동으로 띄워놓는 코드를 htop_nvidia처럼 작성할 수 있는데,
취향대로 크기 조절도 가능하다.
- 현재 선택된 pane의 크기를 WIDTH x HEIGHT로 만듦.
resize-pane -x WIDTH -y HEIGHT
굳이 htop이나 nvidia-smi가 아니더라도 원하는 프로그램은 뭐든 돌려놓을 수 있다.
마지막으로, 이렇게 정의한 함수들을 잘 조합해서 자신만의 tmux 레이아웃을 만들어놓고
tmux.sh 같은 파일에 저장해놓으면 이제 컴퓨터를 재부팅할 때마다 걱정할 필요가 없다!
export SESSION='0'
tmux new-session -d -s $SESSION
tmux rename-window 'homepage'
tmux select-window -t $SESSION:0
divide_two
login_all 'homepage' 1
tmux new-window -t $SESSION:1 -n 'local'
tmux select-window -t $SESSION:1
divide_four
htop_nvidia
tmux new-window -t $SESSION:2 -n 'local-sub'
tmux select-window -t $SESSION:2
divide_two
tmux new-window -t $SESSION:3 -n 'jupiter'
tmux select-window -t $SESSION:3
divide_four
login_all 'jupiter' 4
htop_nvidia
tmux select-window -t $SESSION:1
tmux attach -t $SESSION
몇 가지 확인만 하자면,
- SESSION이라는 이름의 session을 detach 상태 (-d)로 만든다.
new-session -d -s SESSION
해당 session을 background에 놓고, 다양한 명령어로 원하는 레이아웃을 구현한 뒤에 다시 attach 해주는 식으로
스크립트를 깔끔하게 만들 수 있다.
나 같은 경우에는 굳이 1번부터 window를 시작하지 않고, 0번에 조금 덜 쓰는 홈페이지 서버를 연결해두었다.
그 후에는
- NAME이라는 이름의 window를 만든다.
rename-window NAME - SESSION의 N번 window를 선택한다. select-pane과는 조금 다르게 session 이름을 지정해줘야 정상적으로 작동한다.
select-window -t SESSION:N - SESSION에 NAME이라는 이름의 N번 window를 만든다. window 생성 시에 인덱스도 지정이 가능하네.
new-window -t SESSION:N -n NAME
명령어들로 window를 잔뜩 만든 뒤에, 원하는 형태로 분할해놓고 필요하다면 htop과 nvidia-smi까지 실행하도록 했다.
마지막으로 1번 window를 select-window 명령으로 선택해주고 해당 session을 attach 하도록 하면
전체 스크립트를 실행시켰을 때 간편하게 내가 만들어놓은 레이아웃으로 복귀할 수 있다.
물론 해당 session이 돌아가고 있을 때, 다시 한번 이 스크립트를 실행시키면 난리가 날 수 있으니 주의.
조금 더 찾아보면 같은 이름의 session이 있을 때는 경고 메시지가 나오게 할 수 있지 않을까?
일단 지금은 패스...
암튼 tmux 잘 사용하기 끝.
'잡기술 > Ubuntu' 카테고리의 다른 글
티먹스 tmux 사용해서 터미널 여러 개 띄우기 (2) - 스크롤, .tmux.conf (0) | 2021.04.28 |
---|---|
티먹스 tmux 사용해서 터미널 여러 개 띄우기 (1) (0) | 2021.04.26 |
터미널에서 함수 사용하기 (0) | 2021.04.24 |
우분투 파일에서 특정 단어 찾기 - grep (0) | 2021.04.24 |
우분투 터미널 출력 로그 파일로 저장하기 - tee (0) | 2021.04.24 |