지난번에 이어 리눅스(Linux)의 시그널에 대해 알아볼 것이다.
시그널(signal) 은 리눅스나 유닉스 같은 운영체제에서 프로세스에 비동기적으로 이벤트를 알리기 위해 사용하는 일종의 알람 메커니즘이다. 프로그램이 평소 동작하다가도 외부에서 멈추라는 등의 요청을 받을 수 있어야 하는데, 이때 사용하는 게 바로 시그널이다.
시그널이 무엇이고, 어떤 명령어들을 사용해 동작하는지 아래 설명을 통해 알아보자.
✅ 1. 리눅스 표준 입출력 (Standard I/O)
종류 | 설명 | 파일 번호 |
stdin | 사용자 입력 (키보드 등) | 0 |
stdout | 일반 출력 (모니터 등) | 1 |
stderr | 오류 메시지 출력 | 2 |
비유로 이해:
- stdin: 손님이 주방에 주문 넣는 창구
- stdout: 주방에서 손님에게 음식 전달
- stderr: 주방에 문제 생기면 울리는 경고벨
✅ 2. 리디렉션 (Redirection)
기호 | 의미 |
> | 표준출력 덮어쓰기 |
>> | 표준출력 이어쓰기 |
< | 표준입력으로 파일에서 읽기 |
2> | 표준에러를 파일로 저장 |
2>&1 | 표준에러를 표준출력으로 병합 |
&> | stdout + stderr 동시 저장 (일부 쉘에서만 작동) |
/dev/null | 출력을 버림 (black hole) |
예시:
ls -l > list.txt # 출력 결과를 list.txt에 저장
ls x > out.txt 2> err.txt # 표준출력은 out.txt, 에러는 err.txt
command > /dev/null # 출력은 무시
✅ 3. tee 명령어 (분기 처리)
- 기능: 출력을 화면에 보여주면서 동시에 파일에도 저장
- 형식: command | tee file.txt
- -a 옵션: 이어쓰기 모드 (append)
예시:
ls -al | tee result.txt
echo "log" | tee -a log.txt
command 2>&1 | tee both.log
✅ 4. 리눅스 종료 코드 (Exit Code)
종료 코드 | 의미 |
0 | 성공 |
1 이상 | 실패 또는 오류 코드 (사용자 정의 가능) |
확인 명령어:
echo $?
연결 연산자:
연산자 | 의미 |
&& | 앞 명령 성공 시 뒤 명령 실행 |
|| | 앞 명령 실패 시 뒤 명령 실행 |
; | 앞 명령과 무관하게 실행 |
& | 백그라운드 실행 (비동기) |
예시:
make && echo "성공" || echo "실패"
✅ 5. 종료 코드 매크로
C언어에서는 다음과 같이 상수 대신 의미 있는 이름을 사용:
매크로 | 값 | 의미 |
EXIT_SUCCESS | 0 | 성공 종료 |
EXIT_FAILURE | 1 | 실패 종료 |
#define ERR_CONFIG_MISSING 2 | 2 | 사용자 정의 오류 |
예시:
exit(EXIT_FAILURE); // 실패 종료
exit(ERR_CONFIG_MISSING); // 정의된 코드로 종료
→ 자식 프로세스의 종료 상태는 WEXITSTATUS(status)로 해석 가능.
✅ 6. 리눅스 시그널 (Signal)
📌 개념
- 커널이 비동기 이벤트를 프로세스에 전달하는 방식
- 사용자의 키 입력, 예외, 타이머 등으로 발생
📌 주요 시그널
키보드 | 시그널 | 설명 |
Ctrl+C | SIGINT | 인터럽트 (프로세스 종료 요청) |
Ctrl+Z | SIGTSTP | 중지 (일시 정지) |
Ctrl+\ | SIGQUIT | 종료 및 코어덤프 |
Ctrl+D | EOF | 입력 종료 표시 |
kill -SIGTERM <PID> | SIGTERM | 정상 종료 요청 |
kill -9 <PID> | SIGKILL | 강제 종료 |
📌 시그널 처리 방법
🔹 쉘 스크립트
trap 'echo 종료 중…; exit' SIGINT
trap '' SIGTERM # 무시
🔹 C 언어
signal(SIGINT, SIG_IGN); // SIGINT 무시
✅ 실무 적용 요약
항목 | 활용 예시 |
표준 입출력 | 로그, 오류 처리, 사용자 입력 처리 |
리디렉션 | 결과 파일 저장, 로그 분리, 무시 처리 |
tee | 로그 저장과 화면 출력 동시 처리 |
종료 코드 | 스크립트 흐름 제어 (성공/실패 판단) |
명령 연결 | 성공 조건 분기, 백그라운드 작업 |
매크로 | 유지보수 쉬운 종료 코드 관리 |
시그널 | 데몬 종료 처리, 사용자 인터럽트 대응 |
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.