컴퓨터 사용 시간 관리가 중요합니다. ‘timeout’ 명령어를 사용하면 프로세스 실행 시간을 제한하여, 특정 시간 동안만 작동하도록 설정할 수 있습니다. 이제 이 명령어를 활용하여 프로그램 실행에 시간 제한을 두는 방법을 알아보겠습니다.
‘timeout’ 명령어란 무엇일까요?
‘timeout’ 명령어는 지정된 시간 동안만 프로그램이 실행되도록 제어합니다. 왜 이런 기능이 필요할까요?
프로세스가 실행되어야 할 정확한 시간을 알고 있을 때 유용합니다. 예를 들어, 로그 파일이 하드 드라이브 공간을 과도하게 차지하지 않도록 로깅 프로그램의 실행 시간을 제한할 수 있습니다. 또는, 프로그램이 얼마나 오래 실행될지 모르지만 무한정으로 실행되는 것을 막고 싶을 때도 유용합니다.
때로는 네트워크 트래픽을 과도하게 발생시켜 네트워크 성능을 저하시키거나, 컴퓨터 리소스를 과도하게 사용하여 시스템 성능을 떨어뜨리는 프로그램이 있을 수 있습니다. 이런 프로그램을 장시간 실행하면 좋지 않습니다. ‘ping’ 명령어 같은 간단한 유틸리티도 이러한 문제를 일으킬 수 있습니다.
‘timeout’ 명령어는 GNU core utilities의 일부이며, Linux 및 macOS와 같은 Unix 계열 운영 체제에 기본적으로 포함되어 있습니다. 별도로 설치할 필요 없이 바로 사용할 수 있습니다.
‘timeout’ 명령어 시작하기
간단한 예시를 통해 ‘timeout’ 명령어를 사용해 보겠습니다. 기본적으로 ‘ping’ 명령어는 사용자가 Ctrl+C를 눌러 중단하기 전까지 계속 실행됩니다.
ping 192.168.4.28
‘timeout’ 명령어를 사용하여 ‘ping’ 실행 시간을 제한하면 네트워크 대역폭 사용을 조절하고, ‘ping’을 보내는 장치에 과도한 부담을 주지 않도록 할 수 있습니다.
다음 명령어는 ‘ping’을 15초 동안만 실행합니다.
timeout 15 ping 192.168.4.28
15초가 지나면 ‘timeout’ 명령어는 ‘ping’ 세션을 종료하고 명령 프롬프트로 돌아갑니다.
다양한 시간 단위와 함께 ‘timeout’ 명령어 사용
시간 값 뒤에 “s”를 붙이지 않아도 ‘timeout’은 초 단위로 시간을 인식합니다. “s”를 추가해도 결과는 같습니다.
분, 시간, 일 단위로 시간을 지정하려면 “m”, “h”, “d”를 사용해야 합니다.
다음은 ‘ping’을 3분 동안 실행하는 명령어입니다.
timeout 3m ping 192.168.4.28
‘ping’은 3분 동안 실행된 후 ‘timeout’에 의해 종료됩니다.
‘timeout’으로 데이터 캡처 시간 제한하기
데이터 캡처 파일은 매우 빠르게 용량이 커질 수 있습니다. 이러한 파일이 너무 커져서 다루기 어려워지는 것을 방지하기 위해 데이터 캡처 프로그램의 실행 시간을 제한할 수 있습니다.
여기서는 네트워크 트래픽을 캡처하는 ‘tcpdump’ 도구를 사용합니다. 테스트 환경에서는 Ubuntu Linux 및 Fedora Linux에 ‘tcpdump’가 이미 설치되어 있었지만, Manjaro Linux 및 Arch Linux에서는 다음 명령어를 사용하여 설치해야 했습니다.
sudo pacman -Syu tcpdump
기본 옵션으로 10초 동안 ‘tcpdump’를 실행하고 출력을 ‘capture.txt’ 파일로 리디렉션하는 명령어는 다음과 같습니다.
timeout 10 sudo tcpdump > capture.txt
왜 ‘timeout’이 ‘tcpdump’를 멈추지 못했을까요? 이는 신호와 관련이 있습니다.
올바른 신호 보내기
‘timeout’은 프로그램을 종료하려고 할 때 SIGTERM 신호를 보냅니다. 이 신호는 프로그램에게 종료를 요청하는 것입니다. 하지만 일부 프로그램은 SIGTERM 신호를 무시할 수 있습니다. 이 경우에는 ‘timeout’ 명령어에 좀 더 강력한 조치를 취하도록 해야 합니다.
SIGKILL 신호를 보내도록 ‘timeout’ 명령어를 요청할 수 있습니다.
SIGKILL 신호는 “포착하거나 차단하거나 무시”될 수 없으며, 항상 프로그램에 전달됩니다. SIGKILL은 프로그램에 종료를 요청하는 것이 아니라 즉시 중단시키는 신호입니다.
‘-s'(신호) 옵션을 사용하여 SIGKILL 신호를 보내도록 ‘timeout’에 지시할 수 있습니다.
timeout -s SIGKILL 10 sudo tcpdump > capture.txt
먼저 정중하게 요청하기
SIGTERM을 사용하여 프로그램을 종료하도록 요청하고, SIGTERM이 작동하지 않을 때만 SIGKILL을 보내도록 ‘timeout’에 지시할 수 있습니다.
이를 위해 ‘-k'(종료 후) 옵션을 사용합니다. ‘-k’ 옵션에는 시간 매개변수가 필요합니다.
다음 명령어는 ‘dmesg’를 30초 동안 실행한 다음 SIGTERM 신호로 종료하도록 ‘timeout’에 요청합니다. 40초 후에도 ‘dmesg’가 계속 실행 중이면 SIGTERM 신호가 무시되었다는 뜻이므로 ‘timeout’은 SIGKILL을 보내 작업을 완료해야 합니다.
‘dmesg’는 커널 링 버퍼 메시지를 모니터링하여 터미널 창에 표시하는 유틸리티입니다.
timeout -k 40 30 dmseg -w
‘dmesg’는 30초 동안 실행되고 SIGTERM 신호를 받으면 중단됩니다.
SIGKILL은 항상 터미널 창에 “Killed”라는 메시지를 남기기 때문에, ‘dmesg’가 중단될 때 “Killed” 메시지가 나타나지 않는 것을 보면 SIGKILL이 사용되지 않았음을 알 수 있습니다. 이 경우 SIGTERM 신호로 종료된 것입니다.
프로그램의 종료 코드 확인하기
정상적으로 작동하는 프로그램은 종료될 때 종료 코드를 반환합니다. 이 종료 코드는 프로그램이 실행 중에 오류가 발생했는지 여부를 쉘이나 프로그램을 실행한 프로세스에 알리는 데 사용됩니다.
‘timeout’은 자체 종료 코드를 제공하지만, 일반적으로 ‘timeout’이 제어하는 프로세스의 종료 코드에 더 관심이 있을 수 있습니다.
다음 명령어를 사용하면 ‘ping’을 5초 동안 실행할 수 있습니다. 이 예시에서는 테스트 네트워크에 있는 “Nostromo”라는 컴퓨터에 ‘ping’을 보내고 있습니다.
timeout 5 ping Nostromo.local
명령어는 5초 동안 실행되고 ‘timeout’에 의해 종료됩니다. 다음 명령어를 사용하여 종료 코드를 확인할 수 있습니다.
echo $?
종료 코드는 124입니다. 이것은 프로그램이 SIGTERM을 사용하여 종료되었음을 나타내기 위해 ‘timeout’이 사용하는 값입니다. 만약 SIGKILL이 프로그램을 종료했다면 종료 코드는 137이 됩니다.
Ctrl+C를 사용하여 프로그램을 중단시키면 ‘timeout’의 종료 코드는 0이 됩니다.
timeout 5 ping Nostromo.local
echo $?
‘timeout’이 프로그램을 종료하기 전에 프로그램 실행이 완료되면, ‘timeout’은 프로그램의 종료 코드를 쉘로 반환할 수 있습니다.
이를 위해서는 프로그램이 자동으로 중지되어야 하며(즉, ‘timeout’에 의해 종료되지 않아야 함), ‘–preserve-status’ 옵션을 사용해야 합니다.
5개의 ‘ping’ 요청과 함께 ‘-c'(횟수) 옵션을 사용하면 ‘ping’은 5개의 요청만 실행됩니다. 제한 시간을 1분으로 지정하면 ‘ping’이 자동으로 종료됩니다. 그 후, ‘echo’를 사용하여 종료 값을 확인할 수 있습니다.
timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?
‘ping’은 5개의 요청을 완료하고 종료됩니다. 종료 코드는 0입니다.
종료 코드가 ‘ping’에서 오는 것인지 확인하기 위해 ‘ping’을 강제로 실행시켜 다른 종료 코드를 생성해 보겠습니다. 존재하지 않는 IP 주소로 ‘ping’을 보내면 오류 코드가 발생하며 ‘ping’은 실패합니다. ‘echo’를 사용하여 종료 코드가 0이 아닌지 확인할 수 있습니다.
timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?
‘ping’ 명령어는 존재하지 않는 장치에 도달할 수 없으므로 오류를 보고하고 종료됩니다. 종료 코드는 2입니다. 이것은 ‘ping’이 일반 오류에 사용하는 종료 코드입니다.
기본 규칙 설정
‘timeout’ 명령어는 실행 중인 프로그램에 제약을 주는 데 사용됩니다. 로그 파일이 하드 드라이브 공간을 과도하게 차지하거나, 네트워크 도구를 실행한 것을 잊어버릴 수 있는 경우, ‘timeout’으로 제어하여 컴퓨터가 자동으로 조절되도록 설정하십시오.