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/null
inotifywait
- 쓰기가 이루어질 때마다
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