Unix / Linux-신호 및 트랩
이 장에서는 유닉스의 시그널과 트랩에 대해 자세히 논의 할 것입니다.
신호는 중요한 이벤트가 발생했음을 나타 내기 위해 프로그램에 전송되는 소프트웨어 인터럽트입니다. 이벤트는 사용자 요청에서 잘못된 메모리 액세스 오류까지 다양합니다. 인터럽트 신호와 같은 일부 신호는 사용자가 일반적인 제어 흐름에없는 작업을 프로그램에 요청했음을 나타냅니다.
다음 표에는 프로그램에서 접하고 사용하고자하는 일반적인 신호가 나열되어 있습니다.
신호 이름 | 신호 번호 | 기술 |
---|---|---|
SIGHUP | 1 | 제어 단말에서 끊김 또는 제어 프로세스 종료 감지 |
SIGINT | 2 | 사용자가 인터럽트 신호 (Ctrl + C)를 보내면 발생합니다. |
SIGQUIT | 삼 | 사용자가 종료 신호를 보내는 경우 발생 (Ctrl + D) |
SIGFPE | 8 | 잘못된 수학적 연산을 시도하면 발행됩니다. |
SIGKILL | 9 | 프로세스가이 신호를 받으면 즉시 종료해야하며 정리 작업을 수행하지 않습니다. |
SIGALRM | 14 | 알람 시계 신호 (타이머에 사용됨) |
SIGTERM | 15 | 소프트웨어 종료 신호 (기본적으로 kill에 의해 전송 됨) |
신호 목록
시스템에서 지원하는 모든 신호를 쉽게 나열 할 수있는 방법이 있습니다. 그냥 발행kill -l 명령하고 지원되는 모든 신호를 표시합니다.
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
실제 신호 목록은 Solaris, HP-UX 및 Linux에 따라 다릅니다.
기본 동작
모든 신호에는 연관된 기본 동작이 있습니다. 신호에 대한 기본 동작은 스크립트 나 프로그램이 신호를받을 때 수행하는 동작입니다.
가능한 기본 동작 중 일부는-
프로세스를 종료하십시오.
신호를 무시하십시오.
코어 덤프. 이렇게하면 다음과 같은 파일이 생성됩니다.core 프로세스가 신호를 받았을 때의 메모리 이미지를 포함합니다.
프로세스를 중지하십시오.
중지 된 프로세스를 계속하십시오.
신호 보내기
프로그램이나 스크립트에 신호를 전달하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법 중 하나는 사용자가CONTROL-C 아니면 그 INTERRUPT key 스크립트가 실행되는 동안.
누를 때 Ctrl+C 키, SIGINT 스크립트로 전송되고 정의 된 기본 작업 스크립트에 따라 종료됩니다.
신호를 전달하는 다른 일반적인 방법은 kill command, 그 구문은 다음과 같습니다-
$ kill -signal pid
여기 signal 전달할 신호의 번호 또는 이름이며 pid신호가 전송되어야하는 프로세스 ID입니다. 예를 들어-
$ kill -1 1001
위의 명령은 HUP 또는 hang-up 신호를 process ID 1001. 동일한 프로세스에 종료 신호를 보내려면 다음 명령을 사용하십시오.
$ kill -9 1001
이것은 다음으로 실행되는 프로세스를 죽입니다. process ID 1001.
신호 트래핑
당신이 누르면 Ctrl + C 쉘 프로그램을 실행하는 동안 터미널이나 브레이크 키를, 일반적으로 그 프로그램을 즉시 종료하고 명령 프롬프트가 리턴됩니다. 이것은 항상 바람직한 것은 아닙니다. 예를 들어, 정리되지 않는 임시 파일이 많이 남게 될 수 있습니다.
이러한 신호를 트래핑하는 것은 매우 쉽고 trap 명령은 다음 구문을 사용합니다.
$ trap commands signals
여기서 명령 은 유효한 Unix 명령이거나 사용자 정의 함수일 수 있으며 signal은 트랩하려는 신호 목록이 될 수 있습니다.
쉘 스크립트에서 트랩에 대한 두 가지 일반적인 용도가 있습니다.
- 임시 파일 정리
- 신호 무시
임시 파일 정리
trap 명령의 예로서 다음은 일부 파일을 제거하고 누군가가 터미널에서 프로그램을 중단하려고하면 종료하는 방법을 보여줍니다.
$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2
이 트랩이 실행되는 셸 프로그램의 지점에서 두 파일은 work1$$ 과 dataout$$ 프로그램이 신호 번호 2를 수신하면 자동으로 제거됩니다.
따라서이 트랩이 실행 된 후 사용자가 프로그램 실행을 중단하면이 두 파일이 정리된다는 것을 확신 할 수 있습니다. 그만큼exit 다음에 오는 명령 rm 그것이 없으면 신호가 수신되었을 때 중단 된 지점에서 프로그램에서 실행이 계속되기 때문에 필요합니다.
신호 번호 1이 생성됩니다. hangup. 누군가 고의로 회선을 끊거나 회선이 우연히 끊어집니다.
이 경우 신호 목록에 신호 번호 1을 추가하여 두 개의 지정된 파일을 제거하도록 앞의 트랩을 수정할 수 있습니다.
$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2
이제 이러한 파일은 줄이 끊기거나 Ctrl + C 키를 누르면 제거됩니다.
트랩에 지정된 명령은 둘 이상의 명령을 포함하는 경우 따옴표로 묶어야합니다. 또한 쉘은 trap 명령이 실행될 때와 나열된 신호 중 하나가 수신 될 때 명령 행을 스캔합니다.
따라서 앞의 예에서 값은 WORKDIR 과 $$trap 명령이 실행될 때 대체됩니다. 신호 1 또는 2가 수신 될 때이 대체가 발생하도록하려면 명령을 작은 따옴표 안에 넣을 수 있습니다.
$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2
신호 무시
트랩에 대해 나열된 명령이 널이면 지정된 신호가 수신 될 때 무시됩니다. 예를 들어, 명령-
$ trap '' 2
이것은 인터럽트 신호가 무시되도록 지정합니다. 중단을 원하지 않는 작업을 수행 할 때 특정 신호를 무시할 수 있습니다. 다음과 같이 무시할 여러 신호를 지정할 수 있습니다.
$ trap '' 1 2 3 15
무시할 신호에 대해 첫 번째 인수를 지정해야하며, 자체 의미가 별도로있는 다음을 작성하는 것과 동일하지 않습니다.
$ trap 2
신호를 무시하면 모든 서브 쉘도 해당 신호를 무시합니다. 그러나 신호 수신시 수행 할 조치를 지정하면 모든 서브 쉘은 해당 신호 수신시 기본 조치를 계속 취합니다.
트랩 재설정
신호 수신시 수행 할 기본 동작을 변경 한 후 첫 번째 인수를 생략하면 트랩을 사용하여 다시 변경할 수 있습니다. 그래서-
$ trap 1 2
이렇게하면 신호 1 또는 2를 수신 할 때 취할 조치가 기본값으로 재설정됩니다.