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

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

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

timeout 명령을 사용하면 다음을 수행할 수 있습니다. 시간의 길이에 제한을 두다 에 대한 프로그램이 실행됩니다. 그런데 왜 그렇게 하고 싶습니까?

한 가지 경우는 프로세스를 실행하려는 시간을 정확히 알고 있는 경우입니다. 일반적인 사용 사례는 로그 파일이 하드 드라이브 공간을 가차 없이 차지하지 않도록 로깅 또는 데이터 캡처 프로그램을 시간 초과로 제어하는 ​​것입니다.

또 다른 경우는 프로세스가 얼마나 오래 실행되기를 원하는지 모르지만 무한정 실행되는 것은 원하지 않는다는 것을 알고 있는 경우입니다. 실행 중인 프로세스를 설정하고 터미널 창을 최소화하고 잊어버리는 습관이 있을 수 있습니다.

일부 프로그램(심지어 단순한 유틸리티)은 네트워크 성능을 방해할 수 있는 수준에서 네트워크 트래픽을 생성할 수 있습니다. 또는 대상 장치의 리소스를 묶어 성능을 저하시킬 수 있습니다. (ping, 나는 당신을보고 있습니다.) 당신이 컴퓨터에서 떨어져있는 동안 이러한 유형의 프로그램을 장기간 실행하는 것은 나쁜 습관입니다.

시간 초과는 다음의 일부입니다. GNU 핵심 유틸리티 따라서 macOS와 같은 Linux 및 Unix 계열 운영 체제에는 모두 타임아웃이 내장되어 있습니다. 설치할 것이 없습니다. 바로 사용할 수 있습니다.

시간 초과 시작하기

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

ping 192.168.4.28

시간 초과를 사용하여 ping이 계속 실행되지 않도록 하여 네트워크 대역폭을 갉아먹고 ping 중인 장치를 방해할 수 있습니다.

  Linux에 Brave Browser를 설치하는 방법

이 다음 명령은 시간 제한을 사용하여 ping을 제한합니다. ping에 15초의 실행 시간을 허용합니다.

timeout 15 ping 192.168.4.28

15초 후 타임아웃은 ping 세션을 종료하고 명령줄 프롬프트로 돌아갑니다.

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

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

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

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

timeout 3m ping 192.168.4.28

ping은 타임아웃이 시작되어 ping 세션을 중지하기 전에 3분 동안 실행됩니다.

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

일부 데이터 캡처 파일은 매우 빠르게 커질 수 있습니다. 이러한 파일이 다루기 힘들거나 크기가 문제가 되는 것을 방지하려면 캡처 프로그램이 실행될 수 있는 시간을 제한하십시오.

이 예에서는 tcpdump를 사용하고 있습니다. 네트워크 트래픽 캡처 도구. 이 기사가 연구된 테스트 머신에는 tcpdump가 이미 Ubuntu Linux 및 Fedora Linux에 설치되어 있습니다. Manjaro Linux 및 Arch Linux에 다음 명령을 사용하여 설치해야 했습니다.

sudo pacman -Syu tcpdump

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

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt in a terminal window” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump에는 캡처된 네트워크 트래픽을 파일에 저장하는 자체 옵션이 있습니다. 이것은 빠른 해킹이기 때문에 tcpdump가 아니라 timeout에 대해 다시 논의합니다.)</p>
<p>tcpdump는 네트워크 트래픽 캡처를 시작하고 10초 동안 기다립니다.  그리고 10초가 왔다 갔다 하고 tcpdump는 여전히 실행 중이고 capture.txt는 여전히 크기가 커지고 있습니다.  tcpdump를 중지하려면 성급하게 Ctrl+C를 해야 합니다.</p>
<p>capture.txt의 크기를 ls로 확인하면 몇 초 만에 209K로 커진 것을 알 수 있습니다.  그 파일은 빠르게 성장하고 있었습니다!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

무슨 일이에요? 시간 초과가 tcpdump를 중지하지 않은 이유는 무엇입니까?

  오프라인 암호 생성기 및 금고

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

올바른 신호 보내기

시간 초과가 프로그램을 중지하려고 할 때 전송합니다. SIGTERM 신호. 이것은 정중하게 프로그램을 종료하도록 요청합니다. 일부 프로그램은 SIGTERM 신호를 무시하도록 선택할 수 있습니다. 그런 일이 발생하면 timeout을 좀 더 강력하게 지정해야 합니다.

대신 SIGKILL 신호를 보내도록 타임아웃을 요청하여 이를 수행할 수 있습니다.

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

-s(신호) 옵션을 사용하여 SIGKILL 신호를 보내도록 타임아웃을 알릴 수 있습니다.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt in a terminal window” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>이번에는 10초가 지나면 tcpdump가 중지됩니다.</p>
<p>< img src=

공손하게 먼저 묻기

SIGTERM을 사용하여 프로그램을 중지하고 SIGTERM이 작동하지 않는 경우에만 SIGKILL을 보내도록 타임아웃을 요청할 수 있습니다.

이를 위해 -k(이후 종료) 옵션을 사용합니다. -k 옵션에는 매개변수로 시간 값이 필요합니다.

이 명령에서 dmesg를 30초 동안 실행한 다음 SIGTERM 신호로 종료하도록 시간 초과를 요청합니다. 40초 후에도 dmesg가 계속 실행 중이면 외교적 SIGTERM이 무시되었고 시간 초과가 SIGKILL을 보내 작업을 완료해야 함을 의미합니다.

dmesg는 다음을 수행할 수 있는 유틸리티입니다. 커널 링 버퍼 메시지 모니터링 터미널 창에 표시합니다.

timeout -k 40 30 dmseg -w

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

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

프로그램의 종료 코드 검색

제대로 작동하는 프로그램은 종료될 때 값을 다시 셸에 전달합니다. 이것은 종료 코드로 알려져 있습니다. 일반적으로 이것은 프로그램이 실행될 때 문제가 발생했는지 여부를 쉘 또는 프로그램을 실행한 모든 프로세스에 알리는 데 사용됩니다.

  노트북 디스플레이의 대비 및 채도를 변경하는 방법

timeout은 자체 종료 코드를 제공하지만 우리는 그것에 대해 신경 쓰지 않을 수 있습니다. 타임아웃이 제어하는 ​​프로세스의 종료 코드에 더 관심이 있을 것입니다.

이 명령을 사용하면 5초 동안 ping을 실행할 수 있습니다. 이 기사를 연구하는 데 사용된 테스트 네트워크에 있는 Nostromo라는 컴퓨터에 ping을 보내고 있습니다.

timeout 5 ping Nostromo.local

명령은 5초 동안 실행되고 시간 초과로 종료됩니다. 그런 다음 다음 명령을 사용하여 종료 코드를 확인할 수 있습니다.

echo $?

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

Ctrl+C로 프로그램을 중단하면 시간 초과의 종료 코드는 0입니다.

timeout 5 ping Nostromo.local
echo $?

timeout이 프로그램을 종료하기 전에 프로그램 실행이 끝나면 timeout은 프로그램의 종료 코드를 다시 셸로 전달할 수 있습니다.

이렇게 하려면 프로그램이 저절로 중지되어야 하고(즉, 시간 초과로 종료되지 않음) –preserve-status 옵션을 사용해야 합니다.

5개의 ping 값과 함께 -c(count) 옵션을 사용하면 5개의 요청만 실행됩니다. 제한 시간을 1분으로 지정하면 ping이 자동으로 종료됩니다. 그런 다음 echo를 사용하여 종료 값을 확인할 수 있습니다.

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

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

종료 코드가 ping에서 오는지 확인하기 위해 강제로 ping을 실행하여 다른 종료 코드를 생성해 보겠습니다. 존재하지 않는 IP 주소로 ping 요청을 보내려고 하면 오류 종료 코드와 함께 ping이 실패합니다. 그런 다음 echo를 사용하여 종료 코드가 0이 아닌지 확인할 수 있습니다.

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

ping 명령은 분명히 존재하지 않는 장치에 도달할 수 없으므로 오류를 보고하고 종료됩니다. 종료 코드는 2입니다. 이것은 ping이 일반 오류에 사용하는 종료 코드입니다.

기본 규칙 설정

timeout은 실행 중인 프로그램에 일부 경계를 제공하는 것입니다. 로그 파일이 하드 드라이브를 오버런할 위험이 있거나 실행 중인 네트워크 도구를 잊어버릴 수 있는 경우 시간 초과로 랩핑하고 컴퓨터가 자동으로 조절되도록 하십시오.