我正在尝试在远程服务器上安排作业。我希望将此作业安排为距当前服务器时间一分钟或距上次在服务器上运行的计划作业的服务器时间一分钟。这样,就不会同时运行两个作业(从而避免竞争条件)。
作业调度是通过远程 (linux) 服务器上的 at
命令完成的。我被迫使用 at
因为我在连接到同一服务器的多个主机上运行一堆复杂的模拟以请求下一次模拟(为简洁起见,我的问题中省略了这部分)。
我在尝试将作业安排在最后一个计划作业后一分钟(如果没有计划作业,则从现在开始一分钟)运行时遇到问题。我的调度程序脚本当前如下所示:
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
如果我能得到有关如何修复此错误的任何帮助,我将不胜感激,因为此错误导致我的整个设置变得疯狂。
谢谢
最佳答案
只是一个想法。为什么不创建一个临时文件并解决 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,也许你可以更好地看到错误。
我猜测 python 代码会在某种奇怪的情况下崩溃,缺少前导零、上午/下午,这是我目前没有看到的。
关于bash - 使用 `at` 进行作业调度。 "EOF: not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13942420/