대화형 bash에서 이 명령을 실행합니다.
$ timeout 1 sleep 2; echo $?
124
보고124예상대로, timeout(1)에 설명된 대로 1초 후에.
그러나 cron 작업과 동일하게 실행하거나 이를 bash에 명령 문자열로 제공하면 다음과 같은 작업이 수행되지 않습니다.
$ bash -c "timeout 1 sleep 2; echo $?"
0
-i
bash 호출에 추가하는 것은 도움이 되지 않으며, --foreground
timeout(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 $?