리눅스에서 시그널 (signal) 은 중요한 이벤트가 발생했음을 프로세스에 알리기 위해 전송되는 소프트웨어 인터럽트입니다. 리눅스 시그널을 이해하는 것은 프로세스와 시스템 동작을 효과적으로 관리하는 데 기본이 됩니다.
시그널의 목적
시그널은 프로세스 간 통신 (IPC) 의 주요 수단 역할을 합니다. 시그널에는 다음과 같은 여러 용도가 있습니다.
- 사용자 상호작용: 사용자는
Ctrl-C(SIGINT) 또는Ctrl-Z(SIGTSTP) 와 같은 특수 터미널 문자를 입력하여 포그라운드 프로세스를 중단하거나 일시 중지할 수 있습니다. - 커널 알림: 커널은 불법 메모리 접근 (SIGSEGV) 과 같은 하드웨어 또는 소프트웨어 문제를 프로세스에 알리기 위해 시그널을 보낼 수 있습니다.
- 프로세스 관리: 시스템 관리자 및 다른 프로세스는 프로세스 종료 요청이나 설정 재로드와 같이 다른 프로세스의 수명 주기를 관리하기 위해 시그널을 사용합니다.
시그널 수명 주기
이벤트가 시그널을 생성하면, 먼저 대상 프로세스에 전달됩니다. 시그널은 커널이 프로세스를 실행할 때까지 "보류 중" 상태로 유지됩니다. 프로세스가 스케줄링될 때 시그널이 전달됩니다. 하지만 프로세스는 특정 시그널의 전달을 차단하도록 구성할 수 있는 시그널 마스크를 가지고 있습니다.
시그널이 전달되면, 프로세스는 몇 가지 조치 중 하나를 취할 수 있습니다.
- 시그널 무시: 프로세스는 단순히 시그널을 폐기하고 실행을 계속합니다.
- 시그널 처리 (Catch): 프로세스는 이벤트에 응답하기 위해 시그널 핸들러라고 불리는 사용자 정의 함수를 실행합니다.
- 기본 동작 수행: 처리되거나 무시되지 않으면 기본 동작이 수행됩니다. 많은 시그널의 경우, 이는 프로세스 종료를 의미합니다.
- 시그널 차단: 시그널이 프로세스의 시그널 마스크에 있는 경우, 차단 해제될 때까지 보류 상태로 유지됩니다.
일반적인 리눅스 프로세스 시그널
각 시그널은 정수로 정의되지만, 거의 항상 SIG로 시작하는 기호 이름 ( os sig code ) 으로 참조됩니다. 숫자는 아키텍처에 따라 약간 다를 수 있지만 이름은 일관성이 있습니다. 다음은 가장 일반적인 리눅스 프로세스 시그널입니다.
- SIGHUP (1): 끊김 (Hangup). 데몬에게 설정을 다시 로드하도록 지시하는 데 자주 사용됩니다.
- SIGINT (2): 인터럽트.
Ctrl-C로 전송됩니다. 프로세스 종료 요청입니다. - SIGKILL (9): 강제 종료 (Kill). 즉각적이고 강력한 종료입니다. 프로세스는 이 시그널을 처리하거나, 무시하거나, 차단할 수 없습니다.
- SIGSEGV (11): 세그멘테이션 오류. 프로세스가 유효하지 않은 메모리 참조를 했음을 나타냅니다.
- SIGTERM (15): 종료 (Termination). 프로세스에게 종료를 요청하는 표준적이고 정중한 방법입니다.
kill명령으로 전송되는 기본 시그널입니다. 프로세스는 종료하기 전에 정리 작업을 수행하기 위해 이 시그널을 처리할 수 있습니다. 이는 종종 signal 15 linux라고 불립니다. - SIGSTOP: 중지 (Stop). 프로세스를 일시 중지합니다. SIGKILL 과 마찬가지로 처리하거나 무시할 수 없습니다.
The key difference between SIGTERM (linux signal 15) and SIGKILL is that SIGTERM is a request that can be handled, while SIGKILL is a command that destroys the process immediately. (SIGTERM(linux signal 15) 과 SIGKILL 의 주요 차이점은 SIGTERM 은 처리될 수 있는 요청인 반면, SIGKILL 은 프로세스를 즉시 파괴하는 명령이라는 점입니다.)