리눅스 expect 명령 간단한 예제 (2)
작성한 스크립트는 각 원격 시스템들을 로그인 하여 간단하게 프로세스을 죽이고 살리는 스크립트이다.
좀 더 구체적으로 말하자면 7대의 시스템이 A라는 서비스를 하고 있었는데 이를 B라는 서비스로 바꾸고
싶을 때 자동으로 Telnet 원격 로그인을 치고 들어가서 프로세스를 죽이고 살리는 작업을 한다.

switch_mode.sh 스크립트
1) 변수 사용 (앞 부분)
#!/usr/bin/expect
#
# @file                 : switch_mode.sh
# @description          : switch between pac and iux automatically
# @author               : Keywon Ryu <ryusoma
@nate.com>
# @date                 : 2008. 01. 18
#
#
 
set timeout             180            # timeout 값 설정 (send를 하고 expected된 응답이 안 올때의 timeout)
set system [lindex $argv 0]      # ./switch_mode $0 (콘솔에서 실행 시의 첫 인자)

2) 함수 정의
4개의 함수를 구현하였다.
- start_pac : 시스템에 PAC 서비스를 구동시킨다.
- stop_pac : 시스템에 PAC 서비스를 종료한다.
- start_iux : 시스템에 IUX 서비스를 구동시킨다.
- stop_iux : 시스템에 IUX 서비스를 종료한다.
함수 예제)
#----------------------------------------------------------------
# Args  : host (IP address)
# Desc  : 해당 IP 주소 시스템의 IUX 서비스를 구동시킨다.
#----------------------------------------------------------------
proc start_iux host {
        # 해당 호스트에 telnet 로그인
        spawn telnet -l iux -c $host
        expect -re "Password:"
        sleep 0.5
        send "암호\r"
        expect -re "Last login:"
        sleep 0.5
       
        # startPFM 명령 실행 (자체적으로 서비스 framework을 실행시키는 실행 파일이다.)
        send "startPFM\r"
 
        # 12초간 wait
        sleep 12
 
        # startIUX 명령 실행 (자체적으로 IUX 서비스를 실행시키는 실행 파일이다.)
        send "startIUX\r"

        # 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
        expect -re "lucyPAC : Logout from UAS..."
         
        # 로그 아웃
        send "exit\r"
        interact
}

#----------------------------------------------------------------
# Args  : host (IP address)
# Desc  : 해당 IP 주소 시스템의 IUX 시스템을 종료시킨다.
#----------------------------------------------------------------
proc stop_iux host {
        # 해당 호스트에 telnet 로그인
        spawn telnet -l iux -c $host
        expect -re "Password:"
        sleep 0.5
        send "암호\r"
        expect -re "Last login:"
        sleep 0.5

        # stopIUX 명령 실행 (자체적으로 IUX 서비스을 종료시키는 실행 파일이다.)
        send "stopIUX -a\r"

        # 명령을 실행 시 다음의 문자열이 올 때까지 대기한다
        expect -re "Do you really want to stop Process"
       
        # stopIUX 명령에서 Do you really want to stop Process CHT11? (y/n/a/q) 이렇게 물어보며
          답을 기다리게 된다. 이 답에 대해 'a'를 자동으로 보낸다.
        send "a\r"
       
        # 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
        expect -re "lucyPAC : Logout from UAS..."

        # stopPFM 명령 실행 (자체적으로 서비스 framework을 종료시키는 실행 파일이다.)
        send "stopPFM\r"
 
        # 5 초간 기다린다.
        sleep 5
        send "exit\r"
        interact
}

3) 본문 구성
[변수 사용]
[함수 정의]
..................
if { $system != "pac" && $system != "iux" } {
    send "SWTICH> not supported system. between 'pac' and 'iux'\n"
    send "SWITCH> example) ./switch_mode pac\n"
    send "SWITCH> example) ./switch_mode iux\n"
    send "\n"
    exit
}
send "SWITCH> $system switch_mode starting.....\n"
send "\n"
 
if { $system == "pac" } {        # PAC 서비스로 변신
    # IUX 서비스들을 종료
    stop_iux "192.168.1.1"
    stop_iux "192.168.1.2"
    ......................
    stop_iux "192.168.1.7"    

    # PAC 서비스들을 구동
    start_pac "192.168.1.1"
    start_pac "192.168.1.2"
    .......................
    start_pac "192.168.1.7"
}
if { $system == "iux" } {        #IUX 서비스로 변신
    # PAC 서비스들을 종료
    stop_pac "192.168.1.1"
    stop_pac "192.168.1.2"
    ......................
    stop_pac "192.168.1.7"    

    # IUX 서비스들을 구동
    start_iux "192.168.1.1"
    start_iux "192.168.1.2"
    .......................
    start_iux "192.168.1.7"
}

삽질 :
스크립트가 돌다가 예를 들어 중간에 3번째 4번째 시스템에서 갑자기 에러가 나면 다시 복구하느라
테스트 하기 짜증이 났다.
Posted by ryujeen


티스토리 툴바