아래 스크립트를 적용하려고 합니다.https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes) 시스템의 특정 파일이 변경될 때 시스템에서 비디오 스트림을 녹화하도록 하려면 다음을 수행하십시오.
#!/bin/bash
# Set initial time of file
LTIME=`stat -c %Z /path/to/monitored/file`
while true
do
ATIME=`stat -c %Z /path/to/monitored/file`
if [[ "$ATIME" != "$LTIME" ]]
then
echo "RUN COMMAND"
LTIME=$ATIME
fi
sleep 5
done
분명히 스크립트는 5초마다 모니터링되는 파일의 타임스탬프를 폴링하여 변경되었는지 확인하고, 변경된 경우 터미널에 무언가를 표시합니다. echo 명령은 단지 개념 증명일 뿐이며 거의 모든 다른 명령이 스크립트에서 해당 위치를 차지할 수 있다는 것도 분명합니다.
지금까지 얻은 정보는 제 목적에 거의 부합합니다( 70분 스트림 녹화 recordingscript.sh
용 ).mplayer -dumpstream -dumpfile mystream URL
#!/bin/bash
# Set initial time of file
LTIME=`stat -c %Z /path/to/monitored/file`
while true
do
ATIME=`stat -c %Z /path/to/monitored/file`
if [[ "$ATIME" != "$LTIME" ]]; then
/path/to/my/recordingscript.sh
break
LTIME=$ATIME
fi
sleep 5
done
cron
남은 문제는 이 스크립트를 매일 작업(예: 5시간 내에)으로 실행하고 싶다는 것입니다 . 해당 기간 내에 모니터링되는 파일이 변경되지 않은 경우 다음에 cron이 시작할 때까지 스크립트가 중단/종료되기를 원합니다. 약 5시간 동안만 실행된 후 종료되도록 적응 스크립트를 수정하려면 어떻게 해야 합니까? 스크립트를 호출하여 이 작업을 수행할 수 있다는 것을 알고 있지만 timeout 300m
이 작업을 수행하는 다른 더 나은 솔루션이 있을 수 있다고 생각합니다.
답변1
몇 가지 사항을 변경한 다음 스크립트를 사용하는 것이 좋습니다.
- 소문자 변수 이름 사용
- 철자 표현 "5시간(초)"을 사용하여 "포기" 변수를 할당합니다.
filetomonitor
변수에서 모니터링할 파일을 매개변수화합니다.- 셸이 시작된 이후의 시간(초)을 계산하는 bash 변수의 동작에 따라 루프를
while true
5시간 동안 반복 하도록 변경합니다.SECONDS
이는 쉘 스크립트가 시작될 때 0부터 시작됩니다. $( ... )
백틱을 새 형식 으로 변경
업데이트된 스크립트:
#!/bin/bash
giveup=$((5 * 60 * 60))
filetomonitor='/tmp/file-to-monitor'
ltime=$(stat -c %Z "$filetomonitor")
while [[ "$SECONDS" -lt "$giveup" ]]
do
atime=$(stat -c %Z "$filetomonitor")
if [[ "$atime" -ne "$ltime" ]]
then
echo Take action
break ## if we're only supposed to act once
ltime=$atime
fi
sleep 5
done
거기에 남겨두었지만 break
댓글을 달았습니다. 작업을 수행한 후(5시간 전) 스크립트를 종료하려면주석 해제line break
; 그렇지 않으면 현재 버전의 스크립트가 5시간 동안 실행되며(70분 작업이 4시 59분에 시작하는 경우 그 이상) 작업을 여러 번 호출할 수 있습니다.