Busybox `timeout` 명령 상태 반환

Busybox `timeout` 명령 상태 반환

저는 다양한 배포판에서 실행되어야 하는 쉘 스크립트를 작성 중입니다. 그 중 일부는 작동 busybox하고 일부는 작동하지 않습니다.

스크립트는 이 timeout명령을 사용하여 실행하는 명령을 실행하는 데 시간이 더 오래 걸렸는지 <time>또는 덜 걸렸는지 확인합니다. 명령을 종료해야 할 때 항상 반환되므로 사용된 배포에는 coreutils timeout문제가 되지 않으므로 간단합니다.timeout124

Alpine Linux내 문제는 busybox를 사용하여 동일한 명령을 실행할 때 종료 상태가 시간 초과 후 명령을 종료해야 한다는 것입니다 . 그러나 0Ubuntu의 패키지 timeout에서 명령을 사용 busybox하면 143.

이 두 timeout명령(모두 busybox)이 다른 반환 값을 제공하는 이유는 무엇입니까?

명령이 시간 초과되었는지 확인하는 데 사용할 수 있는 일관성이나 규칙이 있습니까?

답변1

Alpine Linux에는 이전 버전의 busybox가 있을 수 있습니다. 간단한 해결책은 일부 출력을 stdout이나 파일에 쓰는 것과 같이 테스트할 수 있는 몇 가지 부작용이 있는 다른 명령을 원래 명령에 추가하는 것입니다.

sleep 2예를 들어 원래 명령의 시간 제한이 1 이 아닌 1이 되기를 원한다고 가정해 보겠습니다.

timeout 1 sleep 2

하다

ok=$(timeout 1 bash -c 'sleep 2; echo ok')

그리고 $ok정상인지 테스트해 보세요. 분명히 명령이 stdout에 기록되면 이를 리디렉션해야 합니다. 예를 들어 이를 fd 3에 복사하고 해당 위치로 리디렉션합니다.

exec 3>&1
ok=$(timeout 1 bash -c 'my command >&3; echo ok')
exec 3>&-

아니면 echo ok파일에 쓰세요.

관련 정보