일정 시간 동안 조용한 경우 프로세스 종료


9

나는 조용히하고 거기에 머무르는 불쾌한 습관을 가지고있는 유틸리티를 가지고 있습니다.이 과정이 얼마나 오래 걸 렸는지 이미 알고 있기 때문에 이것을 timeout싸우기 위해 사용 하고 있지만 때로는 그 전에 그렇게합니다. timeout출력을 stdout으로 보내는 것을 중지하면 프로세스 를 종료 시키는 것과 유사한 도구 가 있습니까?

답변:


8

을 사용 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에 의존 해야합니다.ddtimeout

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존재를).


1
안녕! 고마워요, 당신이 이것에 댓글을 달아서 이것이 무엇을하는지 이해할 수 있습니까?
Benjojo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.