2

リモートサーバーでジョブをスケジュールしようとしています。このジョブを、現在のサーバー時刻から 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

このエラーの結果としてセットアップ全体がおかしくなるので、このエラーを修正する方法について助けていただければ幸いです。

ありがとうございました

4

3 に答える 3

1

ちょっとした考え。here docを使用する代わりに、一時ファイルを作成してEOFの問題を解決してみませんか?

またはこれを行います:

echo python path/to/somescript "$1" | 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"`

EOF を取り除き、エラーをよりよく確認できるかもしれません。

私は、パイソンコードが何らかの奇妙な状態でbarfsしていると推測しています。リードゼロ、午前/午後が欠落しており、現時点では見られません。

于 2012-12-18T22:45:42.170 に答える
1

ではなくcat <<EOF | at ...、試してみてくださいat <time> <<EOF。ここで拷問する理由はありませんcat

于 2012-12-18T22:54:03.510 に答える
0

これは私が最終的に実装したものです:

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
gotime=`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"`

cat <<EOF | at "$gotime"

python path/to/somescript "$1"

EOF

そして、それは魅力のように機能しました

于 2012-12-19T03:05:30.333 に答える