用cygwin安排`at`工作

时间:2012-12-19 08:22:58

标签: python cmd cygwin scheduled-tasks

我正在几台(非等效的)客户机上运行一系列模拟。为了确保每个模拟仅运行一次,客户端连接到Linux服务器并在其上安排任务。 linux服务器运行计划任务,ssh返回客户端,并计划运行下一个模拟的运行。

由于某些客户端运行Windows XP(运行cygwin),客户端的部分调度脚本会检查客户端是运行linux还是cygwin,并使用相应的at命令安排模拟运行(cygwin的at命令使用WinXP at command,它具有不同的语法。)

我能够在Windows客户端上成功安排,调用的脚本运行模拟。但是,我发现虽然执行了计划任务,但模拟永远不会运行 但是,如果我从命令行调用模拟(复制粘贴预定的命令),那么它就可以正常工作。

任何人都可以帮我解决这个问题吗?

更多技术细节

模拟是一个python脚本,位于客户端文件系统中 如果我开始cmd,则会从H:\>开始,这就是我的部分脚本以c: &&开头的原因
预定的脚本是python脚本 正确的python可执行文件是windows路径的一部分,也是cygwin中的$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

安排此模拟(或任何其他python脚本)

1 个答案:

答案 0 :(得分:0)

问题是即使python的路径在系统路径中,当安排任务时,此路径也不会生效。因此,需要明确提供python.exe的路径。因此,替换

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"

"c:\\python27\python.exe" "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"

修复了问题