저는 다양한 배포판에서 실행되어야 하는 쉘 스크립트를 작성 중입니다. 그 중 일부는 작동 busybox
하고 일부는 작동하지 않습니다.
스크립트는 이 timeout
명령을 사용하여 실행하는 명령을 실행하는 데 시간이 더 오래 걸렸는지 <time>
또는 덜 걸렸는지 확인합니다. 명령을 종료해야 할 때 항상 반환되므로 사용된 배포에는 coreutils
timeout
문제가 되지 않으므로 간단합니다.timeout
124
Alpine Linux
내 문제는 busybox를 사용하여 동일한 명령을 실행할 때 종료 상태가 시간 초과 후 명령을 종료해야 한다는 것입니다 . 그러나 0
Ubuntu의 패키지 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
파일에 쓰세요.