【问题标题】:Schedule `at` jobs with cygwin使用 cygwin 安排 `at` 作业
【发布时间】:2012-12-06 13:21:45
【问题描述】:

我正在几台(非等效)客户端计算机上运行大量模拟。为了确保每个模拟只运行一次,客户端连接到 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 脚本)

【问题讨论】:

    标签: python cmd cygwin scheduled-tasks


    【解决方案1】:

    问题是即使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"
    

    解决问题

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2020-05-27
      • 2017-10-28
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多