リモートサーバーでジョブをスケジュールしようとしています。このジョブを、現在のサーバー時刻から 1 分後にスケジュールするか、サーバーで実行する最後にスケジュールされたジョブのサーバー時刻から 1 分後にスケジュールする必要があります。このようにして、2 つのジョブが同時に実行されることはありません (したがって、競合状態が回避されます)。
ジョブのスケジューリングはat
、リモート (Linux) サーバー上のコマンドで実行されます。at
同じサーバーに接続して次のシミュレーションを要求する複数のホストで一連の複雑なシミュレーションを実行しているため、使用を余儀なくされています (この部分は簡潔にするために質問から省略されています)。
最後にスケジュールされたジョブの 1 分後 (または、スケジュールされたジョブがない場合は 1 分後) にジョブを実行するようにスケジュールしようとすると、問題が発生します。現在、私のスケジューラ スクリプトは次のようになっています。
minute=`atq | sort -t" " -k1 -nr | head -n1 | cut -d' ' -f4 | cut -d":" -f1,2`
curr=`date | cut -d' ' -f4 | cut -d':' -f1,2`
# the 'python -c" prints the correct scheduling time to stdout
cat <<EOF | at `python -c "import sys; hour,minute=map(int,max(sys.argv[1:]).split(':')); minute += 1; hour, minute = [(hour,minute), ((hour+1)%24,(minute+2)%60)][minute>=60]; print '%d:%02d'%(hour, minute)" "$minute" "$curr"`
python path/to/somescript "$1"
EOF
ただし、このスクリプトでは、次のエラーが発生します。
somescript: 8: EOF: not found
ただし、次のように時刻をハードコードすると、そのエラーはなくなり、スケジュールは期待どおりに進みます。
minute=`atq | sort -t" " -k1 -nr | head -n1 | cut -d' ' -f4 | cut -d":" -f1,2`
curr=`date | cut -d' ' -f4 | cut -d':' -f1,2`
cat <<EOF | at 16:48 # or whatever other time
python path/to/somescript "$1"
EOF
このエラーの結果としてセットアップ全体がおかしくなるので、このエラーを修正する方法について助けていただければ幸いです。
ありがとうございました