我在几台(非等效)客户端机器上运行一堆模拟。为了确保每个模拟只运行一次,客户端连接到 Linux 服务器并在其上安排任务。linux 服务器运行计划任务,该任务ssh
返回客户端并计划运行下一个要运行的模拟。
由于部分客户端运行windows XP(运行cygwin),客户端的部分调度脚本会检查客户端运行的是linux还是cygwin,并使用相应at
的命令调度模拟的运行(cygwin的at
命令使用WinXPat
命令,它有不同的语法)。
我能够在 Windows 客户端上成功调度,调用的脚本运行模拟。但是,我发现尽管执行了计划任务,但从未运行过模拟。
但是如果我从命令行调用模拟(复制粘贴预定的命令),那么它工作得很好。
谁能帮我解决这个问题?
更多技术细节:
模拟是一个python脚本,它位于客户端文件系统
中以及cygwin中的变量cmd
H:\>
c: &&
$PATH
我的预定脚本(相关部分):
import subprocess
import sys
import smtplib
scenario, p,h,t,c,m,run, IP = sys.argv[1:]
homedir = 'myUserName'
if IP == "137.122.88.124":
homedir = 'myOtherUserName'
subprocess.check_call("""c: && cd \"c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\" && python "c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\\GP%(run)s.py" """ %{'home':homedir, 'scenario':scenario, 'popsize':p, 'height':h, 'tournsize':t, 'crossprob':c, 'mutprob':m, 'run':run}, shell=True)
为清楚起见,以下是我在上面调用的命令,subprocess.check_call
由换行符分隔:
c: &&
cd \"c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\" &&
python "c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\\GP%(run)s.py"
编辑 1:
为了测试是否调用了预定脚本,我在脚本顶部添加了以下几行:
f = open("C:\\Documents and Settings\\user\\Desktop\\somesimfile.txt", 'w')
f.write('I actually ran')
f.close()
因此,如果脚本在 python 下运行,它会留下一个碎片文件来确认它已经运行。
调度程序显示作业已执行后,碎片文件丢失。因此,该脚本从未运行。
编辑 2:
考虑到调度程序可能会在 cygwin 环境中运行命令,我将碎片文件路径更改为/home/user/somesimfile.txt
尽管如此,没有创建碎片文件。
我只能得出结论,即使任务已安排,它也没有运行。
认为这可能是权限问题,我检查了一下,我所有的模拟脚本都有755
权限。
编辑 3:
这似乎也不是我登录权限的限制。我可以cmd
使用我的登录名直接安排任务并获得结果。不过,我无法直接从cmd