- Published on
Linux timeout 명령어와 Kill signal
- Authors

- Name
- Indo Yoon
timeout이란?
특정 커맨드를 실행하고 지정된 수행시간(DURATION) 동안 끝나지 않을 경우 종료(kill)시킨다. 사실은 종료시킨다기보다는 지정된 시그널을 프로세스에 보낸다는 것이 더 정확하지만, 일반적으로 SIGTERM 을 이용해 종료시키기 때문에 이렇게 설명이 되어있는 것 같다.
참고로
kill커맨드도 실제로 kill을 하지는 않고 시그널을 보낼 뿐이다. 그래서kill -9 pid와 같이 kill signal을 옵션으로 줘야 프로세스가 종료된다.
사용법
timeout 커맨드의 셸에서의 사용 방법은 다음과 같다.
$ timeout [OPTION] DURATION COMMAND [ARG]
옵션은 여러가지가 있는데 주로 -s 또는 --signal 옵션을 사용한다. 프로세스가 종료될 때 어떤 신호를 보낼지 결정할 수 있기 대문이다. manpage의 시그널 옵션에 관한 설명은 다음과 같다.
-s, --signal=SIGNAL
specify the signal to be sent on timeout;
SIGNAL may be a name like 'HUP' or a number;
see 'kill -l' for a list of signals
여기서 SIGNAL 은 시스템에 지정되어 있는 시그널을 의미하는데, 이는 다음 섹션에서 자세하게 알아본다. 일반적으로 9 또는 KILL 을 시그널로 주어 프로세스를 종료시킨다.
DURATION 은 실수형(float) 숫자로 일, 시, 분, 초를 각각 d, h, m, s를 suffix로 시간을 표기하게 된다. 아래 예제에서는 0.0001d 를 사용했다.
$ timeout 0.0001d ping localhost # 0.0001d ~ 8.64s

다만 여러 suffix를 함께 사용할 수 없기 때문에 실수형 숫자와 suffix를 잘 계산해서 적어야 한다.
SIGNAL
시그널은 운영체제마다 약간씩 다르게 정의되어 있다. 하지만 대체로 POSIX.1-1990 표준에 정의된 시그널은 대부분 공통으로 사용하고 있다. 아래 표는 그 중 일부다. 이외에도 POSIX.1-2001 또는 그 외의 시그널들을 모두 확인하고 싶다면 터미널에서 man 7 signal 을 입력하면 매뉴얼을 볼 수 있다.
| 번호 | 이름 | 설명 | 기본 처리 |
|---|---|---|---|
| 1 | SIGHUP(HUP) | 터미널에서 Hang up이 감지되거나작업 중인 프로세스가 종료될 경우 | 종료 |
| 2 | SIGINT (INT) | 키보드 인터럽트 (Ctrl + C) | 종료 |
| 3 | SIGQUIT(QUIT) | 키보드 종료 (Ctrl + ) | 코어 덤프 |
| 4 | SIGILL(ILL) | 잘못된 명령 | 코어 덤프 |
| 5 | SIGTRAP(TRAP) | trace(추적), breakpoint(중지점)에서 TRAP 발생 | 코어 덤프 |
| 6 | SIGABRT (ABRT) | abort(3) 의 Abort 시그널 | 코어 덤프 |
| 8 | SIGFPE | 부동소수점 에러 | 코어 덤프 |
| 9 | SIGKILL (KILL) | Kill 시그널 | 종료 |
| 11 | SIGSEGV | 메모리 참조 에러 | 코어덤프 |
| 15 | SIGTERM (TERM) | Termination 시그널 | 종료 |
| 17 | SIGSTOP | 프로세스 정지 | 종료 |
이 중 SIGKILL과 SIGSTOP 은 caught, blocked, ignored가 될 수 없다.
위에서 timeout 의 시그널 옵션을 숫자 또는 이름으로 줄 수 있다고 했는데, 위 표의 숫자 또는 이름 중 하나를 선택해 입력하면 된다.
$ timeout --signal=9 1 ping localhost
$ timeout --signal=SIGKILL 1 ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.041 ms
[1] 18314 killed timeout --signal=SIGKILL 1 ping localhost
마지막으로 SIGKILL과 SIGTERM 에 관한 재미있는 만화가 있어 첨부한다.
