
신호 처리
bash 쉘에게 전달되는 신호
다음은 널리 쓰이는 리눅스 신호이다.
| 신호 | 값 | 설명 |
| 1 | SIGHUP | 프로세스를 끊는다 |
| 2 | SIGINT | 프로세스를 중지시킨다 |
| 3 | SIGQUIT | 프로세스를 중단시킨다 |
| 9 | SIGKILL | 무조건 프로세스를 종료한다 |
| 15 | SIGTERM | 가능하면 프로세스를 종료한다 |
| 17 | SIGSTOP | 무조건 프로세스를 중단하지만 종료하지는 않는다 |
| 18 | SIGSTP | 프로세스를 중단 / 일시 중지하지만 종료하지는 않는다 |
| 19 | SIGCONT | 중단되었던 프로세스를 계속한다 |
신호 만들기
프로세스를 중지시키는 SIGINT 신호를 만들어내기 위해서는 Ctrl + C 키 조합을 누른다.
프로세스를 일시 중지시키는 SIGSTP 신호를 만들어내기 위해서는 Ctrl + Z 키 조합을 사용한다.
ps를 통해 실행되고 있거나 중지된 작업의 PID를 알고 있으면 SIGKILL 신호를 보내 종료할 수 있다. (kill -9 사용)
신호 트랩
스크립트가 어떤 신호를 감지하고 처리하기 위해서는 trap 명령을 사용한다.
trap commands signals
#!/bin/bash
# Ctrl+C 신호 트랩
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
# 스크립트에서 종료 트랩
trap "echo Goodbye..." EXIT
echo "This is a test script"
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
# 트랩 제거
trap -- SIGINT
echo "This is the end of the test script"
백그라운드 모드에서 스크립트 실행하기
백그라운드 프로세스란 지금 터미널에서 실행시키고 있지 않은 프로세스로, 백그라운드 모드에서 프로세스는 터미널 세션의
STDIN, STDOUT 및 STDERR 과는 연결되어 있지 않다.
백그라운드 모드에서 쉘 스크립트를 실행하기 위해서는 명령 다음에 앰퍼샌드(&) 기호를 놓기만 하면 된다.
다만 백그라운드 프로세스가 실행되는 동안 STDOUT 및 STDERR 메시지는 계속해서 터미널 모니터를 사용한다.
따라서 백그라운드에서 실행시킬 목적으로 만든 스크립트에서는 STDOUT, STDERR를 리다이렉트하는 것이 좋다.
끊김 없이 스크립트 실행하기
터미널 세션이 종료된뒤에도 백그라운드 모드에서 실행되는 스크립트의 작업이 완료될 때까지 실행시켜야 하는 경우가 있다.
이러한 경우 nohup 명령을 사용하여 프로세스로 전송되는 모든 SIGHUP 신호를 차단할 수 있다.
다음은 nohup 명령을 사용한 예시이다.
nohup ./test.sh &
nohup 명령은 프로세스와 터미널의 관계를 끊기 때문에 STDOUT, STDERR 출력 링크를 잃는다.
그리고 nohup.out이라는 파일로 리다이렉트한다.
작업 제어
작업 제어란 작업을 시작, 중단, 종료, 재개시키는 기능을 총칭한다.
jobs 명령을 통해 쉘이 처리하고 있는 현재의 작업을 볼 수 있다. -l 매개변수를 사용하면 pid 까지 출력한다.
jobs 명령의 출력에 +, - 기호가 붙는데 전자는 기본 작업, 후자는 현재 기본 작업이 처리를 완료했을 때 기본 작업이 될 작업이다.
중단된 백그라운드 작업은 bg 명령을 통해 재개할 수 있으며 매개변수는 작업 번호이다.
포그라운드 모드에서 작업을 다시 시작하려면 작업 번호와 함께 fg 명령을 사용한다.
nice 활용하기
멀티태스킹 운영체제에서 커널은 시스템에서 실행되는 각 프로세스에 대해 CPU 시간을 할당하며,
이는 스케줄링 우선순위에 따라 이루어진다. 기본적으로 쉘에서 시작된 모든 프로세스는 리눅스 시스템에서 동일한 우선순위이다.
스케줄링 우선순위는 -20부터 +19 사이의 정수값이고 bash 쉘은 모든 프로세스를 우선순위 0으로 설정한다.
-20의 우선순위가 제일 높고 +19가 제일 낮다.
nice 명령을 실행시키려면 -n 커맨드라인 옵션으로 새로운 우선순위를 지정한다.
renice 활용하기
이미 실행중인 명령의 우순선위를 변경하고 싶다면 renice 명령을 실행한다.
실행중인 프로세스의 우선순위를 변경하기 위해서 PID를 지정할 수 있다.
# 우선순위 -10으로 변경
nice -n -10 ./test.sh > output &
# pid 5055
ps -p 5055 -o pid,ppid,ni,cmd
# 우선순위 +10으로 변경
renice -n 10 -p 5055
시계처럼 정확히 실행하기
스크립트를 미리 설정된 시간에 자동으로 실행하고 싶다면 at 명령과 크론 테이블을 사용한다.
at 명령을 사용하여 작업 예약하기
at 명령은 쉘이 작업이 실행해야 할 때를 통제하는 대기열에 작업을 올린다.
at 데몬인 atd는 백그라운드에서 실행되며 실행시킬 작업의 대기열을 확인한다.
atd 데몬은 at 명령을 사용하여 대기열에 올린 작업에 대해 60초마다 확인하여 설정된 시간과 일치한다면 작업을 시작한다.
at 명령 형식은 다음과 같다.
at [-f filename] time
at 명령을 사용할 때는 스크립트에서 STDOUT, STDERR를 리다이렉트하는 것이 좋다.
atq 명령으로 시스템에 대기중인 작업 목록을 볼 수 있으며 작업을 제거하기 위해선 atrm 명령을 사용한다.
크론 테이블을 사용하여 스크립트를 정기적으로 실행되도록 예약하기
리눅스는 cron 프로그램을 이용하여 정기적으로 실행하는 작업을 예약하며 이를 위한 특별한 테이블인 크론 테이블을 사용한다.
크론 테이블의 형식은 다음과 같다.
min hour dayofmonth month dayofweek command
예를 들어 매주 월요일 오후 4시 15분에 실행하고 싶다면 15 16 * * 1 command와 같이 사용한다.
기존 크론 테이블의 목록을 보기 위해서는 crontab -l 명령을 사용한다.
자신의 크론 테이블에 항목을 추가하고 싶다면 -e 옵션을사용한다.
'LINUX > 리눅스 쉘 스크립트 바이블 정리' 카테고리의 다른 글
| [리눅스 바이블] 15. 데이터 보여주기 (0) | 2022.03.24 |
|---|---|
| [리눅스 바이블] 14. 사용자 입력 처리 (0) | 2022.03.21 |
| [리눅스 바이블] 13. 반복문 사용하기 (0) | 2022.03.14 |
| [리눅스 바이블] 12. 조건문 사용하기 (0) | 2022.03.03 |
| [리눅스 바이블] 11. 스크립트 구축의 기초 (0) | 2022.02.27 |