【问题标题】:Syntax for submitting a qsub job without an actual job file?在没有实际作业文件的情况下提交 qsub 作业的语法?
【发布时间】:2026-01-30 07:25:01
【问题描述】:

我想在不创建离散作业文件的情况下即时提交 qsub 作业。所以,假设我有一个名为“get_time.py”的python 脚本,它只报告时间。而不是像这样制作提交脚本:

cat>job.sub<<eof
    #PBS -l walltime=1:00:00
    cd $PBS_O_WORKDIR
    get_time.py
eof

...然后提交作业:qsub job.sub

我希望能够绕过文件创建步骤,并且我希望构造如下所示: qsub -d . -e get_time.py

-e 是我的虚构参数,它告诉 qsub 以下是要发送到调度程序的代码,而不是使用离散的提交文件。

我疯了吗?似乎应该已经有一个简单的解决方案,但我在任何地方都找不到。感谢您的任何建议!

【问题讨论】:

    标签: python sungridengine qsub pbs


    【解决方案1】:

    如果您可以在 HERE 文档中编写工作,如您的示例所示,您可以将该 HERE 文档直接传递给 qsub,而无需临时文件:

    qsub <<eof
        #PBS -l walltime=1:00:00
        cd \$PBS_O_WORKDIR
        get_time.py
    eof
    

    另请注意,您需要对$PBS_O_WORKDIR 中的美元符号进行转义,否则它将在提交作业之前被插值并最终成为一个空字符串。

    【讨论】:

    • 知道如何以这种方式传递脚本参数吗?如果我执行qsub $arg1 &lt;&lt;eof,我会收到一个错误,因为 qsub 尝试评估 arg1,就好像它是输入文件一样,并且 - 语法不起作用,例如qsub - $arg1 &lt;&lt;eof
    • 您可以将任何您喜欢的代码放入 HERE 文档中。只需将 arg1 放在 get_time.py 之后即可。
    • 对,但这不适用于 qsub 特定项目,如 $NSLOTS,直到 qsub 运行后才存在;它被heredoc评估为一个空字符串。但是我通过在heredoc中转义它来解决这个问题; \$NSLOTS。您还可以转义文件字符串以防止所有扩展,例如&lt;&lt;"EOF"tldp.org/LDP/abs/html/here-docs.html
    • 是的,没错,heredoc 中的任何变量都将在提交之前进行插值,而不是在提交之后,除非您按照您的描述将它们转义。 (实际上,我应该编辑我的答案以反映这一点。)
    【解决方案2】:

    在提供所有选项(-d . 等)后,您可以将任何可执行脚本/文件的名称传递给 qsub。脚本名称之后的任何参数都被视为该脚本的参数。例如,如果我有脚本 test.py:

    #!/usr/bin/python
    from sys import argv
    script, param = argv
    print param
    

    那我可以跑了

    qsub test.py 2
    

    我的日志输出将是2

    需要注意的两个重要事项:

    1. 您的 Python 脚本必须是可执行的(例如 chmod +x test.py)。
    2. 您的 Python 脚本必须有一个 shebang(例如 #!/usr/bin/python)。

    【讨论】:

    • 这就是我的想法。但是,我有一个 python 脚本,它具有权限 -rwxr-xr-x 和 shebang 行#!/usr/bin/env python2.7 和 qsub 对于qsub -N test_script -o logs -e logs -V -cwd /path/to/script.py 失败。我该如何解决这个问题?
    • 是的,在 OGS/GE 2011.11p1 上对我也不起作用
    【解决方案3】:

    在 Grid Engine 中,-by y 指定要执行的东西是二进制文件,而不是脚本:

    qsub -b y get_time.py
    

    【讨论】:

    • 我相信这仅适用于 Sun Grid Engine。 -b 选项意味着 TOURQUE 集群中的其他内容。有关详细信息,请参阅 qsub 手册页link
    【解决方案4】:

    我不明白这个问题,但是...

    echo 'date' | qsub
    

    不适合你?

    【讨论】:

      【解决方案5】:

      如果get_time.py是可执行的,而且shebang是正确的,你应该可以简单运行

      qsub -d . get_time.py
      

      如果由于任一原因失败,您可以使用以下构造

      qsub -d . <<< "python get_time.py"
      

      【讨论】:

      • PBS 版本的PBSPro_12.1.1.131502 似乎不知道-d 参数。
      最近更新 更多