x초 내에 STDOUT으로 출력이 없으면 프로그램을 종료하시겠습니까?

x초 내에 STDOUT으로 출력이 없으면 프로그램을 종료하시겠습니까?

Bash 스크립트는 백그라운드에서 프로그램을 실행하고 프로그램의 표준 출력을 파일로 리디렉션합니다. 지난 x초 동안 표준 출력에 기록되지 않은 경우 프로그램을 종료하려면 어떻게 해야 합니까?

prog > out.txt &
PID=$!
...
wait $PID

다른 프로그램을 통해 출력의 연속성을 확인하는 것을 상상해보십시오. unbuffer출력 버퍼링을 비활성화해야 할 수도 있습니다.

unbuffer prog | ... > out.txt &

답변1

/usr/bin/inotifywait이 옵션 없이 스크립트에서 사용할 수 있으므로 -m첫 번째 쓰기 이벤트에서 모니터링이 중지됩니다. 이 옵션을 사용하면 -t 10프로세스가 코드와 함께 종료됩니다.2

#!/usr/bin/env bash

my_prog > out.txt &
my_prog_pid="$!"
my_watch_status=0

while [ "$my_watch_status" != "2" ]; do
    /usr/bin/inotifywait -qq -t 10 -e modify out.txt 2>/dev/null & 
    wait $!
    my_watch_status="$?"
done

kill -9 "$my_prog_pid"
exit <my exit_code>
  • 옵션 ("매우 조용함") 및 표준 오류 리디렉션은 표준 오류에 대한 진단 정보와 표준 출력에 대한 이벤트 정보를 억제 -qq하도록 설계되었습니다 ./dev/nullinotifywait
  • 쓰기가 이루어질 때마다 out.txt(10초 기간 내) 새로운 10초 모니터링 기간이 시작됩니다.
  • kill -9, 또한 ~으로 알려진신호 살해my_prog, 질서 있는 퇴장에 대한 귀하의 가능한 요청을 인식하지 못하도록 합니다 . 정상적으로 종료하려면 kill "$my_prog_pid"단순 종료를 사용하면 됩니다.
  • 지정된 기간 내에 쓰기 수정이 발생하지 않는 경우에만 스크립트가 종료되고 my_prog선택적으로 종료 코드와 함께 종료됩니다.out.txt
  • 실행 중에는 시간 범위가 완벽한 10초가 아니라는 점에 유의하십시오. 모니터링을 설정하는 데 시간이 걸리기 때문에 실제 시간 창은 10초가 조금 넘습니다(파일의 경우 "밀리초"라고 생각함). 귀하의 경우 하나의 파일만 모니터링하기 때문에 이는 중요하지 않지만 큰 트리(수천 개의 파일이 있는 디렉터리 구조를 상상해 보십시오)를 반복적으로 모니터링한다면 매우 중요해질 수 있습니다. 10초의 시간 창이 애플리케이션에 중요한 경우 여기에 제안된 방법 이외의 방법을 탐색하여 모든 시간 창 범위에 대해 또는 최악의 시나리오로 매번 모니터링을 다시 설정할 필요가 없도록 할 수 있습니다. 이 기간 내에 쓰기 이벤트가 발생한 경우.

답변2

다음과 같이 보일 수 있습니다:

#!/bin/bash

while read line -t 10
do
   echo $line
done

if [ $? -gt 128 ]
then
  echo "Timeout occurred"
  killall -SIGKILL procces
fi

관련 정보