使用`at`进行作业调度。 “EOF:没找到”

时间:2012-12-18 22:17:17

标签: bash scheduled-tasks timedelay

我正在尝试在远程服务器上安排作业。我希望将此作业安排在当前服务器时间的一分钟或从服务器上运行的上一个预定作业的服务器时间开始一分钟。这样,没有两个作业同时运行(因此避免了竞争条件)。

使用远程(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

我很感激有关如何修复此错误的任何帮助,因为我的整个设置因此错误而导致疯狂。

谢谢

2 个答案:

答案 0 :(得分: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,也许你可以更好地看到错误。

我猜测python代码barfs在一些奇怪的情况下,缺少前导零,上午/下午,这是我目前看不到的东西。

答案 1 :(得分: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

它就像一个魅力