Linux/Linux 실습

쉘 스크립트에서 시그널 전송 막기

GGkeeper 2021. 11. 6. 22:41

실습> 쉘 스크립트를 이용해서 15번(SIGTERM) 시그널을 막아보자.

쉘 스크립트에서 시그널을 막는 방법
trap "명령어" 시그널번호
trap "명령어" 시그널이름

1. 스크립트 파일 생성
trap 이 없는 경우

[root@localhost ~]# vi process2.sh

#!/bin/sh

# trap "echo Hello" SIGTERM

sleep 1000


[root@localhost ~]# chmod 755 process2.sh
[root@localhost ~]# ./process2.sh

2. 프로세스 확인

새로운 쉘을 열고 전체 프로세스를 확인해서 process2를 검색한다.
[root@localhost ~]# ps aux | grep process2
root       9515  0.0  0.2 113280  1180 pts/1    S+   20:11   0:00 /bin/sh ./process2.sh
root       9518  0.0  0.2 116972  1016 pts/0    R+   20:11   0:00 grep --color=auto process2

3. 시그널 전송
찾은 프로세스 번호를 kill로 시그널을 전송한다.
[root@localhost ~]# kill 9515

15번 신호를 받은 process2.sh 프로세스는 종료한다.
[root@localhost ~]# ./process2.sh
종료됨

4. 스크립트 파일 생성
trap 이 있는 경우

[root@localhost ~]# vi process2.sh

#!/bin/sh

trap "echo Hello" 15
sleep 1000


[root@localhost ~]# ./process2.sh

5. 프로세스 확인
다른 쉘을 열고 전체 프로세스를 확인해서 process2를 검색한다.
[root@localhost ~]# ps aux | grep process2
root       9543  0.0  0.2 113280  1184 pts/1    S+   20:15   0:00 /bin/sh ./process2.sh
root       9546  0.0  0.2 116972  1016 pts/0    R+   20:16   0:00 grep --color=auto process2

6. 시그널 전송
찾은 프로세스 번호를 kill로 시그널을 전송하면 process2.sh 가 종료가 안된다.
[root@localhost ~]# kill 9543



실습> SIGINT 시그널 막기

1. 스크립트 생성
trap이 없는 경우
[root@localhost ~]# vi process3.sh

#!/bin/sh

# trap "echo Hello" SIGINT

while :
do
    echo "시그널 테스트"
    sleep 1
done


2. 퍼미션 변경
[root@localhost ~]# chmod 755 process3.sh

3. 프로세스 실행
프로세스가 실행중에 Ctrl + C 를 누르면 인터럽트 시그널(2, SIGINT)이 발생되서 프로세스가 종료된다.
[root@localhost ~]# ./process3.sh
시그널 테스트
시그널 테스트
시그널 테스트
시그널 테스트
시그널 테스트
^C   <-- Ctrl + C 에 의해서 프로세스가 종료된다.
#


4. 스크립트 생성
trap이 있는 경우
[root@localhost ~]# vi process3.sh

#!/bin/sh

# SIGINT 시그널이 발생되는 화면에 Hello를 출력한다.
trap "echo Hello" SIGINT

while :
do
    echo "시그널 테스트"
    sleep 1
done


5. 퍼미션 변경
# chmod 755 process3.sh

6. 프로세스 실행
프로세스가 실행중에 Ctrl + C 를 누르면 인터럽트 시그널(2, SIGINT)이 발생되서 프로세스에게 전달된다.
하지만 process3.sh 스크립트는 trap 명령어를 이용해서 SIGINT 시그널을 무력화 시켰기 때문에 
프로세스가 종료되지 않는다.
[root@localhost ~]# ./process3.sh
시그널 테스트
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
시그널 테스트
  :
  :
^C   

7. 프로세스 종료
[root@localhost ~]# ps aux | grep process3
root       9715  0.0  0.2 113284  1408 pts/1    S+   20:49   0:00 /bin/sh ./process3.sh
root       9769  0.0  0.2 116972  1016 pts/0    R+   20:51   0:00 grep --color=auto process3
[root@localhost ~]# kill 9715

[root@localhost ~]# ./process3.sh
시그널 테스트
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
^CHello  <-- trap 때문에 Ctrl + C 가 먹히지 않는다.
시그널 테스트
시그널 테스트
  :
  :
종료됨