답변:
을 사용 zsh
하면 다음을 수행 할 수 있습니다.
zmodload zsh/system
coproc your-command
while :; do
sysread -t 10 -o 1 <&p && continue
if (( $? == 4 )); then
echo "Timeout" >&2
kill $!
fi
break
done
아이디어는 -t
옵션 을 사용하여 시간 초과로 출력 sysread
을 읽습니다 your-command
.
참고가 만드는 your-command
의 출력 파이프. your-command
터미널에 가지 않을 때 출력 버퍼링 을 시작 하는 것일 수 있습니다 .이 경우 잠시 동안 아무것도 출력하지 않지만 어떻게 든 중단 되지 않았기 때문에 해당 버퍼링으로 인해 출력되는 것을 알 수 있습니다 .
stdbuf -oL your-command
라인 버퍼링을 복원하거나 (명령이 stdio를 사용 하는 경우) 터미널 출력을 위조하는 zpty
대신 사용하여이 문제를 해결할 수 있습니다 coproc
.
를 사용 하면 가능한 경우 GNU와 GNU bash
에 의존 해야합니다.dd
timeout
coproc your-command
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done
대신 coproc
프로세스 대체를 사용할 수도 있습니다.
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done 3< <(your-command)
(에 해당하지 않습니다 일 zsh
또는 ksh93
때문에이 $!
의 PID를 포함하지 않는 your-command
존재를).
STDOUT을 파일로 리디렉션 한 다음 파일의 mtime이 임계 값보다 큰 경우 monit의 타임 스탬프 테스트 를 사용 하여 프로세스를 다시 시작했습니다.