Tag: screen

screen으로 여러 윈도우 한번에 열기

screen을 이용해 여러 윈도우를 한번에 열고 각각의 윈도우에서는 적당한 호스트를 연결하는 쉘 스크립트 입니다. 이전에 시도했던 것에서 많은 문제가 발생해서 사용하지 않고 있었으나 이것은 좀 쓸만합니다.

#!/bin/bash
SCREENNAME=stack
NL=`echo -ne '\015'`

if screen -ls | egrep -q "[0-9].$SCREENNAME"; then
        echo "screen named $SCREEN_NAME already exists"
        exit
fi

screen -d -m -S $SCREENNAME -t shell
sleep 1

host_spec="host1/192.168.0.10 host2/192.168.0.11"
for spec in $host_spec; do
        name=`echo "$spec" | cut -d '/' -f 1`
        host=`echo "$spec" | cut -d '/' -f 2`

        screen -S $SCREENNAME -X screen -t "$name"
        screen -S $SCREENNAME -p "$name" -X stuff "sshpass -ppassword ssh root@$host$NL"
done

echo "please run screen -r 'screen -r $SCREENNAME'"

물론 이것도 약간의 문제점이 있습니다. 명령을 실행하면 screen이 background에서 detach된 상태로 만들어 지는데, 이를 수동으로 attach해야하는 문제가 있습니다.

그래도 이전에 화면 깨지는 것보다는 훨씬 낫죠. ㅎㅎ

ps. 이 스크립트는 devstack의 stack.sh를 많이 참고했습니다.


Screen session 저장?

제목이 영 이상하긴 한데요.. screen으로 작업하다보면 가끔 난감한 경우가 있습니다.

screen의 세션이 저 멀리 서버에 있어서 이 세션이 영원이 닫히지 않는다고 생각하면 별 문제 없을텐데, 이게 가끔 리부팅한다던가, 아니면 로컬에 있어서 리부팅하면 날라가는 경우.. .근데 이 세션들이 아주아주 자주 사용하는 경우 계속 세로운 세션 만드는 것 영 귀찮습니다.

저같은 경우는 개발, 테스트하면서 여러 서버들을 동시에 봐야해서, screen으로 여러개 움직이면서 작업하는데, 이거 참 날아가니깐.. 귀찮습니다.

뒤져보니 세션을 완전히 저장하고, 다시 살리는 방법은 없습니다. 하지만 가능한 방법은 screen.rc를 이용하여 그 서버에 연결되는 윈도우만 열어도 상당히 편리합니다.

screen.rc 파일을 적당히 만들고 screen -c screen.rc 로 그 세션을 시작하면 되죠..

screen.rc:

sessionname my-persistent-session

screen -t 'server01' sshpass -p <pass> ssh <server>
screen -t 'server01' sshpass -p <pass> ssh <server>

여기까지 하면 괜찮습니다. 그런데 사람의 욕심이라는게 말이죠. 위처럼하면 문제는 sshpass 명령이 종료되거나 ssh 연결이 안되면 해당 윈도우는 닫힌다는 것입니다. 이거 참 난감하죠.. 궁리해봤는데, screen 의 명령으로는 해결할 수 없고 아래처럼 ssh를 실행하는 스크립트를 만들어서 그걸로 연결하고, 해당 스크립트에서는 ssh 연결후 bash를 실행하면 됩니다.

bin/sshpass.sh:

#!/bin/sh
sshpass $1 $2 $3 $4
$SHELL

그러면, screen.rc의 내용도 바뀌겠죠?

screen.rc:

sessionname my-persistent-session

screen -t 'server01' sshpass.sh -p <pass&gt; ssh <server>
screen -t 'server01' sshpass.sh -p <pass&gt; ssh <server>

이제 screen -s screen.rc 하면 언제나 원하는 윈도우를 연 스크린으로... ㅎㅎ

물론 더 좋은 방법 있으면 알려주삼~~


screen 상태표시줄에 세션 이름 표시하기

screen을 여러 세션을 쓰다보면 현재 어떤 세션에 있는지 헷갈린다. 지금만 봐도 세션을 열어놓은게 5개정도이고, 거기서 한 4~5개씩 윈도우를 열어넣고 있으니...

그래서 세션 이름을 상태줄에다 표시하는 방법을 찾아봤다.

screen이 실행하면 $STY 환경변수에 세션이름을 가지고 있는데, 이걸 표시하면 된다. 그런데 이걸 screenrc에 넣으면 표시가 안된다. 그래서 screen -X로 스크린에 명령을 직접 내리는 방식으로 변경했다.

if [ "$STY" != '' ]; then
_STY=`echo $STY | sed 's/^[0-9]*\.//'`
screen -X hardstatus alwayslastline "$_STY] %-Lw%{= BW}%50&gt;%n%f* %t%{-}%+Lw%&lt;"
fi

훨씬 쾌적한 screen life!


netsted screen

screen 안에서 screen을 사용할 경우(방화벽을 통해서 들어가는 시스템... 등등)에 ctrl + a를 누르면 최초 실행한 screen이 이 명령을 먹어버린다.

그럼 screen 안의 screen에는 어떻게 명령을 내릴까? 아주 간단하다.

Ctrl + a, a 명령으로 내리면 된다. screen이 netsted된 횟수만큼 a를 누르고 다음 명령~

ㅋㅋ


gnu screen에서 스크린 이동

음.. 말로 설명하기 좀 거시기 한데.. screen에서 계속 윈도우를 만들면 비어있는 윈도우중 가장 빠른 번호의 윈도으로 만들어 집니다.

윈도우가 0, 1, 4, 5, 7 이렇게 있다면 새로운 윈도우를 만들면 3으로 할당되는 것이죠.

그런데 가끔 이 윈도우를 맘대로 이동하고 싶을 때가 있습니다. 비슷한 작업을 하는 윈도우는 바로 옆에 놓고 싶은데요.. 그럴 경우는

^a:number: 1

이렇게 합면 됩니다. 저거 보고 좀 헷갈리긴 하죠.

  1. ^a: 를 입력하면 screen prompt가 나옵니다.
  2. number: 1 을 입력합니다.
즐거운 screen 생활 하시길~

 


sysutils/screen 기본 사용법

Screen을 이용하면, 로그 아웃 이후에도 그 화면을 유지하고 나중에 동일한 환경으로 복원한다. 그리고 screen안에서 프로그램이 실행중이라면 그 프로그램이 실행중이므로 장시간 동작이 필요한 겨우 터미널을 닫고 다른데서(혹은 같은데서) 다시 작업을 이어가기 위함이다. 혹자는 텍스트 버전 vnc라고도 한다네...

screen 실행 옵션
screen -S [세션 이름]
screen --list
screen -r [세션 이름]: resume session
screen -x: multi display mode

screen 명령어
Ctrl+a,c 새 세션 열기
Ctrl+a,a 다음 세션으로 이동
Ctrl+a,k 스크린 닫기
Ctrl+a,d Detatch
Ctrl+a,w 스크린 리스트
Ctrl+0~9: 지정 창으로 이동
Ctrl+x
Ctrl+a,S 화면 수평 분할
Ctrl+a,Tab 화면 이동
Ctrl+a,X 현재 화면 닫기

역시나 글을 적으면서 기억하는거다.


  • Copyright © 1996-2010 Your wish is my command. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress