timeout(1)이 대화형 셸에서 작동하는 것처럼 cron에서 작동하도록 만드는 방법

timeout(1)이 대화형 셸에서 작동하는 것처럼 cron에서 작동하도록 만드는 방법

대화형 bash에서 이 명령을 실행합니다.

$ timeout 1 sleep 2; echo $?
124

보고124예상대로, timeout(1)에 설명된 대로 1초 후에.

그러나 cron 작업과 동일하게 실행하거나 이를 bash에 명령 문자열로 제공하면 다음과 같은 작업이 수행되지 않습니다.

$ bash -c "timeout 1 sleep 2; echo $?"
0

-ibash 호출에 추가하는 것은 도움이 되지 않으며, --foregroundtimeout(1)에 매개변수를 사용하는 것도 도움이 되지 않습니다. ksh와 zsh에서도 동일한 작업을 시도했지만 항상 동일한 결과를 얻었으므로 이는 timeout(1) 작동 방식에 내재된 문제인 것 같습니다.

나는 인터넷을 조금 검색하여 프로세스 그룹을 통해 신호가 진행되는 방식과 관련이 있을 수 있다는 것을 알았지만 비대화형 사례에서 예상대로 시간 초과 작업을 수행하는 방법에 대한 솔루션을 찾을 수 없었습니다.

어떻게 달성할 수 있는지에 대한 힌트가 있나요? 궁극적으로 내가 원하는 것은 영원히 차단될 가능성이 있는 명령을 cron에서 실행하는 것이며 해당 사례를 안정적으로 감지하고 싶습니다.

답변1

큰따옴표로 인해 $?확장되고 있습니다.~ 전에bash 명령이 호출됩니다. 이는 종료 상태로 대체됩니다.이전의명령(첫 번째 명령 exit $?)

빠른 데모

bash -c 'exit 42'
bash -c "timeout 1 sleep 2; echo $?"   # => 42

해결책은 다음과 같습니다.작은따옴표현재 대화형 bash 프로세스가 변수를 확장하지 않도록

bash -c 'timeout 1 sleep 2; echo $?'   # => 124

답변2

다음과 같이 명령을 실행해 볼 수 있습니다.

bash -c "timeout 1 sleep 2"; echo $?

관련 정보