Bash 스크립트의 시간 제한

Bash 스크립트의 시간 제한

시간 제한을 설정하려는 bash 스크립트가 있습니다. 예를 들어 스크립트를 실행하는 데 50초 이상이 소요되면 0으로 종료됩니다. 스크립트 내에서 수행되어야 하며 명령이 스크립트를 호출하는 방법을 변경할 수 없습니다.

가장 좋은 접근 방식은 무엇입니까?

타임트랩 같은게 있나요?

모든 코드를 루프에 넣을 수도 있지만 이 경우에는 그럴 수 없습니다.

답변1

포장지가 필요합니다.

가장 확실한 방법은 원본 스크립트의 이름을 바꾸고 시간 초과 시 원본 스크립트를 호출하는 래퍼 스크립트를 그 자리에 만드는 것입니다. 이에 대한 변형은 스크립트 자체와 다른 이름으로 링크를 만드는 것입니다. 스크립트 호출 방식에 따라 스크립트에서 발생하는 일이 결정됩니다. 잠시 후에 분명해질 것입니다.

인수 없이 스크립트를 호출하는 경우 이 내부 래퍼를 스크립트에 추가할 수 있습니다. 매개변수 timeout의 스위치를 사용하여 다시 자신을 호출합니다 $1.

#!/usr/bin/env bash

TIMEOUT=10
WRAPPER=FALSE
if [ "$1" != FALSE ]; then
    timeout "$TIMEOUT" "$0" "$WRAPPER"
    exit
fi

#the proper script
echo Here\'s the original script starting.
sleep 11
echo End of the original script.   

따라서 이전 솔루션으로 돌아가서 $0스크립트가 어떻게 호출되는지 확인하는 데 사용할 수 있습니다. 파일인가요, 링크인가요?

새 실행 파일/링크를 원하지 않거나 생성할 수 없고 원래 호출에서 매개변수를 사용하는 경우 다른 스위치를 사용할 수 있습니다. 예를 들어 임시 파일을 사용할 수 있습니다. 여기에는 문제가 발생할 경우를 대비해 파일을 정리해야 하는 몇 가지 특수한 경우가 포함됩니다. PPID를 스위치로 사용할 수도 있습니다. 상위 명령이 하위 명령과 동일하면 스크립트가 올바르게 실행되고, 그렇지 않으면 시간 초과 후에 자체적으로 실행됩니다.

답변2

다른 곳에서 답변을 받은 것 같지만, 여기에서 할 수 있는 일이 있습니다.

이 명령이 실행된 시간(초)을 반환하는 명령입니다(추가됨).에스in times은 초만 반환합니다.)

ps -p "<process-id>" -o times=

당신은 또한 필요할 수 있습니다

pgrep <name-of-the-script>

또는 일반적으로

ps -p "$(<name-of-the-script>)" -o times=

프로세스 ID를 가져옵니다.

그런 다음 결과를 변수에 할당하고 필요한 만큼 자주 확인합니다.

관련 정보