以下のスクリプトを適用しようとしています。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
これは、シェルスクリプトの起動時にゼロから始まります。 $( ... )
バックティックを新しい形式に変更
更新されたスクリプト:
#!/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分に開始された場合はそれ以上)、ジョブを複数回呼び出すことができます。