반응형

함수를 활용해서 쉘스크립트안에서 멀티 스레드와 백그라운드를 구현하는 방법에 대해 알아보도록 하겠습니다. 사실 제가 쉘 스크립트를 사용하면서 다른 언어와 비교했을 때 가장 편하다고 생각했던 부분입니다.

 

리눅스에서는 command 뒤에 '&'를 붙이게 되면 백그라운드로 동작하게 되고 리눅스의 예약어 $!로 해당 PID 값을 갖고 있게 되면 그 프로세스를 제어할 수 있습니다. 일단 샘플 코드와 수행 결과 값을 확인해 보겠습니다.

 

 #!/bin/bash

THREAD()
{
        while [ 1 ]
        do
                echo "THREAD 1 : $1"
                sleep 1
        done
}

 

echo "CALL 1st thread - Background Operating"
THREAD first&
THREAD_1st_PID=$!


echo "THREAD PID : $THREAD_1st_PID"
sleep 5
echo "Wait 5sec -> 1st thread suspend 5sec  "
echo "CALL 2nd thread - Background Operating"
kill -19 $THREAD_1st_PID
THREAD second&
THREAD_2nd_PID=$!

sleep 5


echo "Wait 5sec -> 1st thread continue 5sec  "
kill -18 $THREAD_1st_PID
sleep 5
kill -9 $THREAD_1st_PID $THREAD_2nd_PID

 root@ubuntu:/shell# ./multi.sh
CALL 1st thread - Background Operating
THREAD PID : 13595
THREAD 1 : first
THREAD 1 : first
THREAD 1 : first
THREAD 1 : first
THREAD 1 : first
Wait 5sec -> 1st thread suspend 5sec
CALL 2nd thread - Background Operating
THREAD 1 : second
THREAD 1 : second
THREAD 1 : second
THREAD 1 : second
THREAD 1 : second
Wait 5sec -> 1st thread continue 5sec
THREAD 1 : first
THREAD 1 : second
THREAD 1 : first
THREAD 1 : second
THREAD 1 : first
THREAD 1 : second
THREAD 1 : first
THREAD 1 : second
THREAD 1 : first
THREAD 1 : second

 

파란색으로 및줄친 부분이 백그라운드 및 멀티스레드의 핵심적인 요소 입니다. 해당 구문에 백그라운드로 돌리고 해당 프로세스의 PID값을 저장하고 순차적으로 하나의 스레드를 추가로 생성하고 마지막에는 스레드를 종료하고 마치게 되는 구조 입니다.

반응형
반응형

쉘 스크립트를 사용하다 보면 사용자 입력을 받아야 되는 경우가 많습니다.

 

그 때 보다 세련되고 있어??? 보이게 끔 받을 수 있는 방법을 소개하고자 합니다.

 

getopt라는 명령어 인데 먼저 ... 샘플코드를 보도록 하죠

 

 #!/bin/bash

## 도움말 출력하는 함수
help() {
        echo "splt [OPTIONS] FILE"
                echo "    -h         도움말 출력."
                echo "    -a ARG     인자를 받는 opt."
                echo "    -b ARG     인자를 받는 opt2."
                exit 0
}
while getopts "a:b:h" opt
do
case $opt in
a) arg_a=$OPTARG
echo "Arg A: $arg_a"
;;
b) arg_b=$OPTARG
echo "Arg B: $arg_b"
echo "$arg_b"
;;
h) help ;;
?) help ;;
esac
done

 

getopt를 사용하는 이유는

 

1. 다양한 입력 값이 존재할 경우 사용자와 개발자의 편의를 보장하기 위함 이고

2. 스크립트를 보다 체계적으로 관리할 수 있기 때문입니다.

 

가장 중요한 부분은 아래의 구분인데

 

while getopts "a:b:h" opt

보통 다음과 같은 형식을 주로 사용하고 getopt는 첫번째 파라미터로 옵션으로 사용될 문자열을 입력 받고 다음에는 옵션으로 활용되는 변수를 사용합니다.

 

getopt를 사용할 때 주의해야 할 점은 ":" 입니다. 기존적으로 getopt는 한개의 문자만을 구분자로 사용하며 사용할 문자열 뒤에 ":"을 붙이게 되면 뒤에 Value가 붙게 된다는 것을 의미합니다

 

스크립트 실행 결과는 다음과 같습니다

 

root@ubuntu:/shell# ./getopt.sh -a hello
Arg A: hello

root@ubuntu:/shell# ./getopt.sh -b hi
Arg B: hi
hi

root@ubuntu:/shell# ./getopt.sh -h
splt [OPTIONS] FILE
    -h         도움말 출력.
    -a ARG     인자를 받는 opt.
    -b ARG     인자를 받는 opt2. 

 

 

 

반응형
반응형

쉘 스크립트 연재 순서

 

- 자료형

- 기본문법

. if

. switch

. while

. for

. until

- 파이프 라인

- 함수 선언 / 사용하기

- 문자열 다루기

. grep

. cut

. awk

- 사칙연산

- 쉘 스크립트 GUI

- 쉘 스크립트 예제

 

반응형

+ Recent posts