2016-07-27 16 views
0
#!/bin/bash 

at now +1 minutes -f ./test.sh 

logFile="/home/.../testLog.txt" 

time1="114000" 
time2="153000" 
currentTime=`date +"%H%M%S"` 

echo "" >> "$logFile" 
date >> "$logFile" 
echo "$currentTime" >> "$logFile" 
echo "" >> "$logFile" 


if [[ "$currentTime" < "$time1" || "$currentTime" > "$time2" ]] 
then 
    echo "case1" >> "$logFile" 
else 
    echo "case2" >> "$logFile" 
fi 

このスクリプトはtest.shというファイルに保存されています。例えば午後5時にそれを実行すると、case1がログファイルに書き込まれます。しかし、毎秒atコール(1分ごとに発生する)のたびに、スクリプトはcase2をログファイルに書き込みます。なぜ説明できますか?時間を求める仕事で

+0

は、このスクリプトは、それ自体は毎分再スケジュールされていますか?代わりにループやcronからの実行を考えましたか? –

+0

@thatotherguy:私はちょうど仕事でスクリプトがrecrusivelyを呼び出すという事実に気づいた。 – sjsam

+0

@thatotherguy sjsamはすでに説明したように、 'at now at +1 minutes -f。/ test.sh'は、1分後にスクリプトを再帰的に呼び出すatジョブを定義しています。 –

答えて

2

atはでジョブを実行し、スクリプトにはbashが必要ですが、失敗しています。

あなたは現在、廃棄しているエラーを見て、これを確認することができます。それはatによってスケジュールの代わりに、直接実行されていたときに、それはcase2を記述します。この失敗に

sh: cannot open 114000: No such file 
sh: [[: not found 
sh: 111405: not found 

と原因:あなたはif条件はこのような何かを与えることを見つけるだろう。

ではなく、ループまたはcronを使用してください。

+0

ここに問題を投稿するためのコードを簡略化しました。私の実際のスクリプトは毎分呼び出されません。これは、cronジョブが扱うことができないはるかに複雑なものです(cronジョブは多くの場合、規則的です)。また、ループを嫌うのは、スクリプトを停止することなくスクリプトを変更できるようにするためです。他の方法はありませんか? –

+0

スクリプトの内容をスケジュールする代わりに、スクリプトそのものをスケジュールすることができます。 'echo" /path/to/test.sh "|今は+1分」となっている。これにより、 'at'がその内容を' sh'コードとして解釈するのではなく、シバンで指定された正しいシェルでスクリプトを実行するようになります。 –

+0

ありがとう!それは動作し、素晴らしい解決策です! –

関連する問題