Linux에서 timeout 명령을 사용하는 방법

0
1971
bash 프롬프트를 보여주는 Linux 노트북
Fatmawati Achmad Zaenuri / Shutterstock.com

컴퓨터 시간이 충분합니다. 프로세스에 제한 시간을 부여하여 프로세스에 대해 실행할 수있는 최대 시간을 설정할 수 있습니다. timeout명령. 다음은이 명령으로 프로그램 실행을 제한하는 방법에 대한 자습서입니다.

타임 아웃은 무엇을합니까?

그만큼 timeout 명령을 사용하면 프로그램이 실행될 시간의 제한을 설정할 수 있습니다. 그러나 왜 그렇게 하시겠습니까?

한 가지 경우는 프로세스 실행 시간을 정확히 알고있는 경우입니다. 일반적인 유스 케이스는 timeout 로그 파일이 하드 드라이브 공간을 끊임없이 소모하지 않도록 로깅 또는 데이터 캡처 프로그램을 제어하십시오.

또 다른 경우는 프로세스 실행 시간을 모르지만 무한정 실행하지 않으려는 경우입니다. 프로세스 실행 설정, 터미널 창 최소화 및 잊어 버리는 습관이있을 수 있습니다.

간단한 유틸리티조차도 일부 프로그램은 네트워크 성능을 저해 할 수있는 수준에서 네트워크 트래픽을 생성 할 수 있습니다. 또는 대상 장치의 리소스를 묶어 성능을 저하시킬 수 있습니다. (ping컴퓨터를 사용하지 않는 동안 이러한 유형의 프로그램을 장시간 실행하는 것은 좋지 않습니다.

timeout GNU Core Utils의 일부이므로 Linux 및 macOS와 같은 Unix와 유사한 운영 체제에는 모두 시간 초과가 내장되어 있습니다. 설치할 것이 없습니다. 상자에서 바로 사용할 수 있습니다.

타임 아웃 시작하기

간단한 예를 들어 보겠습니다. 예를 들어 기본 명령 줄 옵션을 사용하면 ping Ctrl + C를 눌러 명령을 중지 할 때까지 명령이 실행됩니다. 방해하지 않으면 계속 진행됩니다.

ping 192.168.4.28

터미널 창에서 192.168.4.28 핑

사용하여 timeout, 우리는 확인할 수 있습니다 ping 네트워크 대역폭을 늘리고 핑되는 장치를 방해하지 않습니다.

이 다음 명령은 timeout 시간 제한 ping. 실행 시간이 15 초입니다 ping.

timeout 15 ping 192.168.4.28

터미널 창에서 시간 초과 15 핑 192.168.4.28

15 초 후 timeout 종료 ping 세션과 명령 행 프롬프트로 돌아갑니다.

터미널 창에서 종료 된 핑 세션

다른 시간 단위와 함께 시간 초과 사용

15 뒤에 “s”를 추가 할 필요는 없었습니다. timeout 값이 초 단위라고 가정합니다. “s”를 추가 할 수 있지만 실제로 차이는 없습니다.

분, 시간 또는 일 단위로 측정 된 시간 값을 사용하려면 “m”, “h”또는 “d”를 추가하십시오.

3 분 동안 ping을 실행하려면 다음 명령을 사용하십시오.

timeout 3m ping 192.168.4.28

터미널 창에서 타임 아웃 3m 핑 192.168.4.28

ping 3 분 전에 실행됩니다 timeout 들어와 정지 ping 세션.

터미널 창에서 실행되는 핑 세션

시간 초과로 데이터 캡처 제한

일부 데이터 캡처 파일은 매우 빠르게 커질 수 있습니다. 이러한 파일이 다루기 어렵거나 크기에 문제가 생기지 않도록하려면 캡처 프로그램을 실행할 수있는 시간을 제한하십시오.

이 예에서는 tcpdump네트워크 트래픽 캡처 도구입니다. 이 기사에서 연구 한 테스트 머신에서 tcpdump Ubuntu Linux 및 Fedora Linux에 이미 설치되어 있습니다. 다음 명령으로 Manjaro Linux 및 Arch Linux에 설치해야합니다.

sudo pacman -Syu tcpdump

터미널 창에서 sudo pacman -Syu tcpdump

우리는 실행할 수 있습니다 tcpdump 기본 옵션으로 10 초 동안 다음 명령을 사용하여 출력을 capture.txt라는 파일로 리디렉션합니다.

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump> 터미널 창에서 capture.txt

(tcpdump 캡처 된 네트워크 트래픽을 파일로 저장하는 자체 옵션이 있습니다. 우리가 논의하고 있기 때문에 이것은 빠른 해킹입니다 timeout아니 tcpdump.)

tcpdump 네트워크 트래픽 캡처를 시작하고 10 초 동안 기다립니다. 그리고 10 초가왔다 갔다하고 tcpdump 여전히 실행 중이며 capture.txt의 크기는 계속 커지고 있습니다. 중지하려면 성급한 Ctrl + C가 필요합니다. tcpdump.

capture.txt의 크기 확인 ls 몇 초 만에 209K로 성장했음을 보여줍니다. 그 파일은 빠르게 커지고있었습니다!

ls -lh capture.txt

터미널 창에서 ls -lh capture.txt

어떻게 된 거예요? 왜 안했어 timeout 중지 tcpdump?

모두 신호와 관련이 있습니다.

올바른 신호 보내기

언제 timeout 프로그램을 중지하고 SIGTERM 신호를 보냅니다. 이것은 프로그램을 정중하게 요청합니다. 일부 프로그램은 SIGTERM 신호를 무시하도록 선택할 수 있습니다. 그런 일이 발생하면 우리는 timeout 좀 더 강력 해 지려고

우리는 물어 보면서 그렇게 할 수 있습니다 timeout 대신 SIGKILL 신호를 보냅니다.

SIGKILL 신호는“잡히거나 차단하거나 무시”할 수 없으며 항상 통과합니다. SIGKILL은 정중하게 프로그램 중지를 요구하지 않습니다. SIGKILL은 스톱워치와 코쉬로 모퉁이를 숨 깁니다.

우리는 사용할 수 있습니다 -s 알리는 (신호) 옵션 timeout SIGKILL 신호를 보냅니다.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s 터미널 창에서 SIGKILL 10 sudo tcpdump> capture.txt

이번에는 10 초가 지나면 tcpdump 중지되었습니다.

터미널 창에서 tcpdump가 종료 됨

정중하게 요구

우리는 요청할 수 있습니다 timeout SIGTERM을 사용하여 프로그램을 중지하고 SIGTERM이 작동하지 않는 경우에만 SIGKILL을 보내려고합니다.

이를 위해 우리는 -k (킬 후) 옵션. 그만큼 -k 옵션에는 매개 변수로 시간 값이 필요합니다.

이 명령에서 우리는 묻습니다 timeout 시키다 dmesg 30 초 동안 실행 한 다음 SIGTERM 신호로 종료하십시오. 만약 dmesg 40 초 후에도 여전히 실행 중입니다. 이는 외교 SIGTERM이 무시되었으며 timeout 작업을 마치려면 SIGKILL로 보내야합니다.

dmesg 커널 링 버퍼 메시지를 모니터하고 터미널 창에 표시 할 수있는 유틸리티입니다.

timeout -k 40 30 dmseg -w

터미널 창에서 시간 초과 -k 40 30 dmseg -w

dmesg 30 초 동안 실행되고 SIGTERM 신호를 수신하면 중지됩니다.

터미널 창에서 dmesg의 출력

우리는 그것이 중지 된 SIGKILL이 아님을 알고 있습니다 dmesg SIGKILL은 항상 터미널 창에“Killed”라는 한 단어 사망 기사를 남기기 때문입니다. 이 경우에는 발생하지 않았습니다.

프로그램 종료 코드 검색

올바르게 동작하는 프로그램은 종료 될 때 쉘에 값을 다시 전달합니다. 종료 코드라고합니다. 일반적으로 이것은 프로그램이 실행되는 동안 문제가 발생했는지 여부를 쉘 또는 프로세스가 프로그램을 시작한 프로세스에 알리는 데 사용됩니다.

timeout 자체 종료 코드를 제공하지만 걱정하지 않아도됩니다. 아마도 프로세스의 종료 코드에 더 관심이있을 것입니다. timeout 통제하고 있습니다.

이 명령은 ping 5 초 동안 작동합니다. 이 기사를 연구하는 데 사용 된 테스트 네트워크에있는 Nostromo라는 컴퓨터를 핑합니다.

timeout 5 ping Nostromo.local

터미널 창에서 시간 초과 5 핑 Nostromo.local

이 명령은 5 초 동안 실행되며 timeout 종료합니다. 그런 다음이 명령을 사용하여 종료 코드를 확인할 수 있습니다.

echo $?

핑 및 에코 $의 출력? 터미널 창에서

종료 코드는 124입니다. 이것은 값입니다. timeout SIGTERM을 사용하여 프로그램이 종료되었음을 나타냅니다. SIGKILL이 프로그램을 종료하면 종료 코드는 137입니다.

Ctrl + C로 프로그램을 중단하면 종료 코드가 timeout 0입니다.

timeout 5 ping Nostromo.local
echo $?

시간 종료 5 Ctrl + C를 사용하여 터미널 창에서 Nostromo.local을 ping

프로그램 실행이 종료되면 전에 timeout 그것을 종료 timeout 종료 코드를 프로그램에서 셸로 다시 전달할 수 있습니다.

이런 일이 발생하기 위해서는 프로그램이 자체적으로 중지되어야합니다 (즉, 아니 에 의해 종료 timeout)를 사용해야합니다. --preserve-status 선택권.

우리가 -c 값이 5 인 (카운트) 옵션 ping 다섯 요청 만 해고합니다. 우리가 주면 timeout 1 분 동안 ping 확실히 그 자체로 종료되었을 것입니다. 다음을 사용하여 종료 값을 확인할 수 있습니다 echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

제한 시간 --preserve-status 1m ping -c 5 터미널 창에서 Nostromo.local

ping 5 개의 핑 요청을 완료하고 종료합니다. 종료 코드는 0입니다.

종료 코드가 오는지 확인하려면 ping힘을합시다 ping 다른 종료 코드를 생성합니다. 존재하지 않는 IP 주소로 핑 요청을 보내려고하면 ping 오류 종료 코드와 함께 실패합니다. 그런 다음 사용할 수 있습니다 echo 종료 코드가 0이 아닌지 확인하십시오.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

timeout --preserve-status 1m ping -c 5 터미널 창의 NotHere.local

그만큼 ping 명령은 분명히 존재하지 않는 장치에 도달 할 수 없으므로 오류를보고하고 닫습니다. 종료 코드는 2입니다. 종료 코드입니다 ping 일반적인 오류에 사용합니다.

기본 규칙 설정

timeout 프로그램을 실행하는 데 한계가 있습니다. 로그 파일이 하드 드라이브를 초과하거나 네트워크 도구를 실행 한 것을 잊어 버릴 위험이있는 경우 timeout 컴퓨터가 스스로 조절하도록하십시오.