csub#
命令#
csub-向AIP 提交作业
概要#
csub [选项] 命令 [参数]
csub [-h| -V]
选项列表#
-A 应用名
-a esub参数
-app 配置文件名称
-B
-b [[月:]日:]小时:分钟
-C core限制
-c [小时:]分钟[/host_name|/host_model]
-cwd 作业工作目录
-cwdc 作业工作目录
-D 数据限制
-di Docker镜像名
-do Docker run参数
-dl
-e | -eo err_file
-E “pre_exec_command [参数 …]”
-ENV | -env “none” | “~var_name[,~var_name]…,][var_name=值[,var_name=值]…”
-f “本地文件 op [远程文件]” …
-F 文件大小限制
-G 用户组名
-g 作业组名
-H
-I | -Ip | -Is | -K
-i 输入文件 | -is 输入文件
-J 作业名 | -J “作业名称[索引列表]%作业限制“
-Jd “作业描述”
-k “检查点目录[检查点周期] [方法=方法名称]”
-L 登录shell
-Lp
-M 内存限制
-m “主机名[+[首选项级别]] | 主机组[+[首选项级别]] …”
-N
-n 最小处理器数[,最大处理器数]
-o | -oo 输出文件
-P 项目名称
-p 进程限制
-pack 作业提交文件
-proxy
-q “队列名称 …”
-R “资源请求&” [*-R** “资源请求” …]
-r
-rnc resize_nodify_command
-S stack限制
-Si Singularity镜像文件
-So Singularuty选项
-Sb Singularity_bind
-sp 优先级
-t [[月:]日:]时:分钟
-U 消息模板
-u 邮件用户
-v swap_limit
-W [小时:]分钟[/主机名|/主机模型]
-w ‘依赖关系表达式‘
-XF
-x
-Zs
描述#
提交执行的作业并为其分配唯一的数字作业ID。
当作业、主机、队列和集群的所有条件均满足时,在满足作业所有要求的主机上运行作业。如果AIP 无法立即运行所有作业,则 AIP 调度策略将决定调度顺序。作业将根据当前系统负载启动和暂停。
设置用户执行作业的环境,包括当前工作目录、文件创建掩码和所有环境变量,并在启动作业之前设置AIP 环境变量。
作业运行时,命令行和stdout/stderr 缓冲区存储在执行主机上的 home_directory/.cbsched 目录中。如果此目录无法访问,则使用 /tmp/.cbtmpuser_ID 作为作业的主目录。如果当前工作目录位于提交主机的主目录下,则当前工作目录也会设置为执行主机主目录下的相同相对目录。如果当前工作目录在执行主机上无法访问,则作业将在 /tmp 中运行。
如果csub没有提供命令,csub会提示从标准输入中输入命令。在 LINUX 系统中,在新行输入 CTRL-D 即可终止输入。
默认情况下,AIP 假定集群中所有主机都拥有统一的用户名和用户 ID 空间。也就是说,给定用户提交的作业将在执行主机上使用同一用户的帐户运行。对于用户名和用户 ID 空间不一致的情况,必须使用帐户映射来确定用于运行作业的帐户。
默认情况下,使用命令名称作为作业名称。引号有意义。
默认情况下,该作业不可进行检查点操作。
默认情况下,自动选择合适的队列。如果您通过设置CB_DEFAULTQUEUE 定义了默认队列列表,则会从您的列表中选择该队列。如果未定义 CB_DEFAULTQUEUE,则会从 AIP 管理员指定的系统默认队列列表中选择队列(请参阅 cb.yaml中的default_queues参数)。
默认情况下,假定仅请求一个处理器。
默认情况下,作业不会启动登录shell,而是在提交作业的执行环境下运行作业文件。
默认情况下,作业的输入文件是/dev/null(无输入)。
默认情况下,作业完成后会不向您发送邮件。若发邮件,目的地由cb.yaml 中的mailto定义。邮件内容包括作业报告、作业输出(如有)以及错误消息(如有)。
默认情况下,将作业计入默认项目。默认项目是通过设置环境变量CB_DEFAULTPROJECT 定义的项目。
使用-n提交并行作业。
使用-I、-Is或-Ip提交交互式作业。
使用-J为您的作业分配一个名称。
使用-k指定可检查点的作业。
要终止使用csub提交的作业,请使用ckill。
使用cmod修改通过csub提交的作业。cmod使用的选项与csub类似。
选项#
- -A应用程序名称
使用*应用程序名称*标记作业以便计费。该名称不会像 -app 选项那样通过 $CB_ENVDIR/cb.apps 或 $HOME/.cube/cb.apps 进行验证。
例子:
csub-A fluent myfluent_job
- -app配置名称
将指定的作业*配置名称*分配给作业。对于作业阵列,将相同的配置文件名称分配给作业阵列的所有元素。作业配置文件必须在$CB_ENVDIR/cb.apps 和/或 $HOME/.cube/cb.apps 中配置。
- -B
当作业被分派并开始执行时向您发送邮件。
- -H
提交作业时,将其保持在PSUSP 状态。除非您指示系统恢复该作业(参见 cresume),否则该作业不会被调度。
- -I | -Ip | -Is
提交交互式作业。交互式作业完成或终止后才能提交新作业。
将作业的标准输出(或标准错误)发送到终端。除非指定**-N** 选项 ,否则作业完成后不会发送邮件。
交互式作业可以支持tty终端。
指定-Ip选项时,提交交互式作业,并在作业启动时创建伪终端。某些应用程序(例如**vi**)需要伪终端才能正常运行。
指定-Is选项后,将提交交互式作业,并在作业启动时创建一个支持Shell 模式的伪终端。提交交互式 Shell 或重新定义 CTRL-C 和 CTRL-Z 键的应用程序(例如 jove)时应指定此选项。
如果指定了-iinput_file选项,则您无法通过终端与作业的标准输入进行交互。
如果指定了-oout_file选项,则将作业的标准输出发送到指定的输出文件。如果指定了-eerr_file选项,则将作业的标准错误发送到指定的错误文件。
不能将-I、-Ip或-Is与-K选项一起使用。
例子:
csub-Is bash
- -K
提交作业并等待作业完成。提交作业时,向终端发送“等待调度”消息。作业完成后,向终端发送“作业已完成”消息。
在作业完成之前,您将无法提交其他作业。当需要完成作业才能继续执行(例如作业脚本)时,此功能非常有用。如果由于瞬时故障而需要重新运行作业,则csub会在作业成功完成后返回。csub将以与作业相同的退出代码退出,以便作业脚本能够根据退出代码采取适当的操作。如果作业在等待期间终止,则 csub将以值 126 退出。
不能将-K选项与-I、-Ip或-Is选项一起使用。
- -N
作业完成后,通过邮件向您发送作业报告。当不带任何其他选项使用时,其行为与默认行为相同。
仅与不发送邮件的 -o、-I、-Ip和-Is选项 一起使用,以强制 AIP 在作业完成时向您发送邮件消息。
- -r
如果作业运行时执行主机不可用,则指定该作业将在另一台主机上重新运行。AIP 会将作业重新排入同一作业队列,并使用相同的作业 ID。找到可用的执行主机后,会重新运行该作业,就像提交了新作业一样。您会收到一封邮件,告知您主机故障以及作业已重新排入队列。
如果作业运行时系统出现故障,则指定系统重新启动时该作业将重新排队。
如果执行主机或系统出现故障,则重新运行作业;如果作业本身失败,则不会重新运行作业。
如果在作业执行检查点操作后执行主机不可用(参见csub -k和 cchkpnt 命令),则该作业将从上一个检查点重新启动。重新启动的作业将重新排队等待执行,其方式与使用 crestart 命令重新启动作业的方式相同。为了成功重新启动作业,作业的检查点目录必须位于接收重新启动作业的主机可访问的共享文件系统中。
- -x
将运行作业的主机置于独占执行模式。
在独占执行模式下,您的作业会在主机上自行运行。它只会被调度到没有其他作业正在运行的主机上,并且AIP 不会在该作业完成之前将任何其他作业发送到该主机。
要以独占执行模式提交作业,必须将队列配置为允许独占作业。
- -a esub_参数
该参数以CB_SUB_ADDITIONAL 的 形式存储在作业的参数文件(即CB_SUB_PARM_FILE )中。该文件可以被esub读取。
- -b [[月:]日:]时:分
在指定的日期和时间或之后调度执行作业。日期和时间的格式为[[月:]日:]时:分,其中数字范围如下:月 1-12,日 1-31,时 0-23,分 0-59。
必须至少指定两个字段。这些字段的格式假定为“小时:分钟”。如果指定三个字段,则假定为“日:小时:分钟”,如果指定四个字段,则假定为“月:日:小时:分钟”。
- -C core限制
为属于此作业的所有进程设置每个进程的(软)核心文件大小限制(请参阅getrlimit(2))。核心文件大小限制以 KB 为单位。
此选项的行为取决于特定于平台的LINUX 系统。
在某些情况下,如果作业尝试创建大于指定限制的核心文件,则会向进程发送SIGXFSZ 信号。SIGXFSZ 信号通常会终止该进程。
在其他情况下,核心文件的写入会在指定的限制处终止。
- -c [小时:]分钟[/主机名|/主机型号]
限制作业可使用的总CPU 时间。此选项有助于防止作业失控或占用过多资源。当整个作业的总 CPU 时间达到限制时,会首先向该作业发送 SIGXCPU 信号,然后发送 SIGINT、SIGTERM 和 SIGKILL 信号。
如果cb.yaml 中的 CB_JOB_CPULIMIT 设置为 n,则会禁用 AIP 强制执行的 CPU 限制,并且 AIP 会将限制传递给操作系统。当作业中的一个进程超出 CPU 限制时,操作系统将强制执行该限制。
CPU 限制的格式为 [小时: ]分钟。分钟数可以指定为大于 59 的数字。例如,三个半小时可以指定为 3:30 或 210。
或者,您可以提供AIP 中定义的主机名或主机型号名称。必须在 CPU 限制与主机名或型号名称之间插入“/”。(请参阅 cinfo 获取主机型号信息。)如果未提供主机名或型号名称,AIP 将使用队列级别定义的默认 CPU 时间标准化主机(cb.yaml 中的 DEFAULT_HOST_SPEC)(如果已配置);否则,使用集群级别定义的默认 CPU 时间标准化主机(cb.yaml 中的 DEFAULT_HOST_SPEC)(如果已配置);否则,使用提交主机。
您指定的CPU 时间是标准化 CPU 时间。这样做的目的是,即使作业发送到 CPU 速度更快或更慢的主机,在给定的 CPU 限制下,其处理量也大致相同。每当指定标准化 CPU 时间时,执行主机上的实际时间等于指定时间乘以标准化主机的 CPU 因子,然后除以执行主机的 CPU 因子。
- -cwd 工作目录
指定作业执行的当前工作目录。如果未指定该选项,AIP 将使用运行 csub 的当前工作目录来执行作业。如果作业执行主机上的用户无法访问指定的当前工作目录,则将使用 /tmp 作为当前工作目录。
如果指定的目录不是绝对路径,AIP 将使用用户的主目录$HOME/job_working_directory作为作业执行的当前工作目录。
目录路径可以包含以下动态模式,这些模式区分大小写:
* %J - 作业 ID
* %I - 索引(默认值为 0)
* %P - 项目名称(默认值为“default”)
* %U - 用户名
* %G - 用户组(默认值与用户名相同)
* %H - 第一个执行主机名
* %A - csub -A|-app 中指定的应用程序名称(默认为“_”)
* %D - csub -Jd 中指定的职位描述(默认为“_”)
- -cwdc 工作目录
与-cwd 相同,除非目录不存在,否则 AIP 将尝试以 0700 模式以作业执行用户身份创建目录(只有用户具有该目录的读/写权限)。
如果目录不存在且由于任何原因无法创建(例如用户没有创建权限),则将使用/tmp。
例子:
csub -cwdc /home/u001/%J myjob
- -D 数据限制
为作业中的每个进程设置每个进程的(软)数据段大小限制(参见getrlimit(2))。数据限制以 KB 为单位。调用sbrk函数将数据段扩展到超出数据限制的大小将返回错误。
- -di Docker镜像名
指定用于运行作业的Docker镜像名。这相当于设置环境变量 CB_DOCKER_IMAGE。如果设置了环境变量 CB_DOCKER_IMAGE,则此选项将覆盖环境变量的值。
使用此选项,作业命令将在Docker 容器内运行。如果容器不执行任何命令,则必须将字符串“null”作为作业命令,这告诉调度程序仅将容器作为作业运行,而不执行任何命令。
默认情况下,Docker 容器出于性能考虑使用主机网络。对于 AI 影响作业,当您指定
-do "-p port1:port2"
时,容器将使用 Docker 桥接网络。您也可以指定-do "--network=xxx"
来更改容器使用的网络。出于安全原因,AIP 容器作业将以提交作业的用户身份运行。您无法使用
-do "--user"
更改此设置。AIP 添加的主要“docker run”参数是:
--name=DOCKERNAME --init -i --rm -e CB_ALLOCATION -e CB_JOBID -e CB_SUBCWD -e CB_PORT -e CB_HOSTSIP
。根据 CPU 和 GPU 的分配情况,还会自动添加--cpu
和--gpus
或--device
。- -do Docker_run_options
指定命令“docker run”的选项。这相当于设置环境变量 CB_DOCKER_OPTIONS。如果设置了环境变量 CB_DOCKER_OPTIONS,则此选项将覆盖环境变量的值。
由于已被AIP 使用,因此无法使用以下选项:“
--name
、--cpu
、--gpus
或--device
”。docker run 选项 -u 或
--user
将被忽略,因为在 AIP 中,容器始终以与提交作业的用户相同的 uid:gid 运行。当你从Docker 桥接网络向主机网络进行端口发布时,可以使用保留字 CB_PORT 来指示 AIP 为该作业分配的端口。例如:
AIP 分配的端口为 16331,您希望将容器端口 8088 绑定到该端口。选项为:“-do -p CB_PORT:8088”。如果您要发布多个端口,可以指定 CB_PORT+n。例如:“-do -p CB_PORT:8088 -p CB_PORT+300:8081”。这会将容器端口 8088 发布到主机端口 16331,并将容器端口 8081 发布到主机端口 16631。
- -dl
在执行docker run命令前,先运行docker login。如果设置了环境变量CB_DOCKER_USERNAME和CB_DOCKER_PASSWORD,则使用环境变量值进行认证。如果未设置环境变量,则使用cpasswd命令注册的用户名和密码进行认证。
- -e | -eo 错误文件
指定文件路径。如果指定了-e 选项,则将作业的标准错误输出附加到指定文件。如果指定了 -eo 选项,则该文件将被覆盖。
如果作业启动后无法在执行主机上访问当前工作目录,AIP 会将标准错误输出文件写入 /tmp/。
文件路径可以包含以下动态模式,这些模式区分大小写:
* %J - 作业 ID
* %I - 索引(默认值为 0)
* %P - 项目名称(默认值为“default”)
* %U - 用户名
* %G - 用户组(默认值与用户名相同)
* %H - 第一个执行主机名
* %A - csub -A|-app 中指定的应用程序名称(默认为“_”)
* %D - csub -Jd 中指定的职位描述(默认为“_”)
例子:
csub-e %J-%I-%U.err
- -E “pre_exec_command [参数 …]”
在作业实际运行之前,先在作业的执行主机上运行指定的pre-exec 命令。对于并行作业,pre-exec 命令会在为其选定的第一个主机上运行。如果 pre-exec 命令返回 0(零),则实际作业将在选定的主机上启动。否则,作业(包括 pre-exec 命令)将返回“等待”状态并重新安排。
如果您的作业重新进入“等待”状态,AIP 会在条件允许的情况下继续尝试运行预执行命令和实际作业。因此,请确保您的预执行命令可以多次运行而不会产生副作用。
pre-exec 命令的标准输入和输出指向与实际作业相同的文件。pre-exec 命令与实际作业在相同的用户 ID、环境、主目录和工作目录下运行。如果 pre-exec 命令不在用户的正常执行路径($PATH 变量)中,则必须指定该命令的完整路径名。
例子:
csub-E “/home/u001/my_preexec.sh”myjob
- -ENV | -env “none”|”~var_name[,~*var_name*]…,][var_name=值[,*var_name*=值]…”
为作业设置环境变量。以下多个短语可以用逗号(,) 分隔。请注意 Shell 对特殊字符的解释,这可能会影响传递给 csub 命令的字符串的实际值。使用单引号 (’) 引用整个参数。
“none” 表示从提交环境中移除所有现有的环境变量。默认情况下,csub 会将作业提交时设置的所有当前环境变量复制到作业执行环境中。
~var_name 表示取消设置该作业的 环境变量var_name 。
var_name=value 表示设置或更新环境变量。
例子:
csub -ENV "~XDG_RUNTIME_DIR,~XDG_SESSION_ID,MYPROJNAME=rndproject" myjob
- -f “本地文件 操作[远程文件]” …
在本地(提交)主机和远程(执行)主机之间复制文件。请指定绝对路径或相对路径,包括文件名。在非共享系统中运行时,应将远程文件指定为不带路径的文件名。
如果未指定远程文件,则默认为本地文件(必须指定)。使用多个-f选项可以指定多个文件。
操作
指定是否将文件复制到远程主机或从远程主机复制回的操作符。该操作符必须用空格括起来。
下面对运算符进行描述:
> 在作业开始前将本地文件复制到远程文件。如果远程文件存在,则覆盖它。
< 作业完成后,将远程文件复制到本地文件。如果本地文件已存在,则覆盖。
<< 作业完成后,将远程文件附加到本地文件。本地文件必须存在。
>< 在作业开始前将本地文件复制到远程文件。如果远程文件存在,则覆盖它。然后在作业完成后将远程文件复制到本地文件。覆盖本地文件。
<> 在作业开始前将本地文件复制到远程文件。如果远程文件存在,则覆盖远程文件。作业完成后,将远程文件复制到本地文件。覆盖本地文件。
如果您使用 -i input_file选项,则无需使用**-f**选项将指定的输入文件复制到执行主机。AIP 会为您执行此操作,并在作业完成后从执行主机中删除输入文件。
如果您使用 -e err_file或-o out_file选项,并且希望在作业完成时将指定的文件复制回提交主机,则必须使用-f选项。
本地文件名和远程文件名都可以包含动态模式(%J、%I、%P、%U、%G、%H、%A、%D),其规范与-cwd选项中描述的相同。
如果提交主机和执行主机的目录结构不同,则必须确保放置远程文件和本地文件的目录存在。
如果本地和远程主机的文件名空间不同,则必须始终指定相对路径名。如果本地和远程主机不共享同一文件系统,则必须确保包含远程文件的目录存在。建议在异构文件系统中运行时,仅指定远程文件的文件名。这会将文件放置在作业的当前工作目录中。如果文件在提交主机和执行主机之间共享,则不会执行文件复制。
AIP 使用crcp传输文件(参见 crcp 命令)。crcp会联系远程主机上的 CBEXE 执行文件传输。如果 CBEXE 不可用,则使用rcp (参见rcp(1))。用户必须确保rcp二进制文件位于执行主机上用户的 $PATH 中。
仅当允许rcp时, 从AIP 客户端主机提交的作业才应指定-f选项。同样,如果使用帐户映射,也必须允许 rcp 。
例子:
csub-cwdc /home/u001/%J -f "/home/u001/myinput > /home/u001/%J" myjob
把整个本地myinput目录传到作业运行主机上的 %J (作业号)的目录中,-cwdc参数会动态生成 %J目录。
- -F 文件限制
为作业中的每个进程设置每个进程的(软)文件大小限制(参见getrlimit(2))。文件大小限制以 KB 为单位。如果作业进程尝试写入超出文件大小限制的文件,则会向该进程发送 SIGXFSZ 信号。SIGXFSZ 信号通常会终止该进程。
- -i 输入文件| -is 输入文件
从指定文件获取作业的标准输入。指定绝对路径或相对路径。输入文件可以是任何类型的文件,但通常是Shell 脚本文本文件。
如果执行主机上存在该文件,AIP 将使用它。否则,AIP 将尝试将文件从提交主机复制到执行主机。为了成功复制文件,您必须允许远程复制 ( rcp ) 访问,或者必须从运行 CBEXE 的服务器主机提交作业。该文件将从提交主机复制到 JOB_SPOOL_DIR 参数指定的目录中的临时文件,或复制到执行主机上的 $HOME/.cbsched 目录中。作业完成后,AIP 会删除此文件。
-is 选项会将输入文件假脱机到 cb.yaml 中 JOB_SPOOL_DIR 参数指定的目录中,并将假脱机文件用作作业的输入文件。默认情况下,如果未指定 JOB_SPOOL_DIR,则输入文件将假脱机到 CB_SHAREDIR/cb_indir。如果 cb_indir 目录不存在,AIP 会在假脱机文件之前创建该目录。作业完成后,AIP 会删除假脱机文件。如果您需要在作业完成之前修改或删除输入文件,请使用-is选项。删除或修改原始输入文件不会影响已提交的作业。
除非使用-is,否则您可以在输入文件的名称中使用以下模式:
* %J - 作业 ID
* %I - 索引(默认值为 0)
* %P - 项目名称(默认值为“default”)
* %U - 用户名
* %G - 用户组(默认值与用户名相同)
* %H - 第一个执行主机名
* %A - csub -A|-app 中指定的应用程序名称(默认为“_”)
* %D - csub -Jd 中指定的职位描述(默认为“_”)
- -g 作业组名称
提交 作业组名称 指定的作业组中的作业。提交作业前,该作业组不必存在。
例如:
csub-g /reg/hug/myg1 job Job101 has been submitted to the default queue [medium]
将作业提交到作业组/reg/hug/myg1。
如果组/reg/hug/myg1 存在,则作业 101 将附加到该作业组。
作业组名称最多可包含512 个字符。
- -J 作业名称 | -J “作业名称[索引列表]%作业槽位限制“
为作业分配指定的名称,并且对于作业阵列,指定作业阵列的索引以及可选地指定在任何给定时间可以运行的最大作业数。
作业名称不必是唯一的。
要指定作业阵列,请将索引列表括在方括号中,并将整个作业阵列规范括在引号中。索引列表是一个逗号分隔的列表,其元素的语法为start[-end[ : step]],其中 start、end 和 step 均为正整数。如果省略 step,则假定 step 为 1。作业阵列索引从 1 开始。默认情况下,最大作业阵列索引为 2.00。
您还可以使用正整数来指定此作业阵列的系统范围作业槽限制(在任何给定时间可以运行的最大作业数)。
阵列中的所有作业共享相同的作业ID 和参数。数组的每个元素都通过其数组索引来区分。
提交作业后,您可以使用作业名称来标识该作业。指定“ job_ID [ index ]”可 处理特定数组的元素。指定“ job_name [ index ]”可处理所有同名阵列的元素。由于作业名称不唯一,因此多个作业阵列可能具有相同的名称,但索引集不同或相同。
例子:
csub-J "a[1-1000,2]%100" myjob
提交一个500单元的阵列作业,阵列索引为1,3,5,…, 999。同一时间不能超过100个单元运行。
- -Jd “作业描述”
为作业分配指定的描述。对于作业阵列,为作业阵列的所有元素分配相同的作业描述。
- -k “checkpoint_dir[checkpoint_period][method=*method_name*]”
使作业可进行检查点操作并指定检查点目录。如果省略检查点句点,则无需使用引号。请指定相对路径名或绝对路径名。
当作业执行检查点操作时,检查点信息存储在checkpoint_dir / job_ID / file_name中。多个作业可以对同一目录执行检查点操作。系统可以创建多个文件。
检查点目录用于重新启动作业(参见 crestart)。
可选地,指定检查点周期(以分钟为单位)。请指定一个正整数。正在运行的作业会在每个检查点周期自动执行检查点操作。可以使用 cchkpnt 更改检查点周期。由于检查点操作是一项重量级操作,因此您应该选择大于半小时的检查点周期。
可选地,指定用于作业的自定义检查点和重启方法。使用method=default表示使用AIP 的默认检查点和重启程序 echkpnt.default 和 erestart.default,这两个程序通常与特定的检查点/重启方法相关联。
echkpnt.method_name 和 erestart.method_name 程序必须位于 CB_ENVDIR/../sbin 或 CB_ECHKPNT_METHOD_DIR 指定的目录中(环境变量或在 cb.yaml 中设置)。
如果已经使用CB_ECHKPNT_METHOD(环境变量或 cb.yaml)指定了自定义检查点和重启方法,则使用 csub -k 指定的方法将覆盖该方法。
AIP 会调用CB_ENVDIR/../sbin 中的echkpnt(参见 echkpnt)来对作业进行检查点操作。您可以通过将 CB_ECHKPNT_METHOD 和 CB_ECHKPNT_METHOD_DIR 定义为环境变量或在 cb.yaml 中将其指向您自己的echkpnt来覆盖作业的默认echkpnt。这允许您使用其他检查点工具,包括应用程序级检查点。
- -L login_shell
使用指定的登录shell 初始化执行环境。指定的登录 shell 必须是绝对路径。这不一定是执行作业的 shell。使用这个参数后所有提交作业本地的环境变量都不会带到作业运行环境中。
例子:
csub-L /bin/bash myjob
- -Lp
当cb.yaml 中指定参数“additional_ports”来限制 AIP 使用的随机端口时,此参数会强制交互式作业 (-I/-Ip/-Is) 使用“additional_ports”范围内的端口。这是为了让交互式作业在作业提交主机和作业执行主机之间存在防火墙的情况下,仍然能够正常工作,并且只有“additional_ports”中指定的端口开放。
默认情况下,即使在cb.yaml 中指定了“additional_ports”,交互式作业也会使用随机端口。
例子:
csub -Lp -I hostname
- -m “主机名[+[首选项级别]] | 主机组[+[首选项级别]] …”
在指定的主机之一上运行作业。
默认情况下,如果有多个主机可供候选,则在负载最低的主机上运行作业。要更改此设置,请在您希望使用的主机或主机组名称后添加加号(+),并可选地在其后添加优先级。对于优先级,请指定一个正整数,数字越大,表示这些主机的优先级越高。
例如,-m“hostA groupB+2 hostC+1”表示groupB是最受欢迎的,而hostA是最不受欢迎的。
有关主机组的信息,请使用cmgroup。
关键字others 可以指定优先级,也可以不指定优先级,以引用未列出的其他主机。关键字 others 必须至少与一个主机名或主机组一起指定,不能单独指定。例如,-m “hostA+ others” 表示 hostA 优先于所有其他主机。
如果同时使用-m host_name[+[pref_level]] | host_group[+[pref_level]]…” 选项和 -q queue_name 选项,则必须将指定的队列配置为包含主机列表中的所有主机。否则,作业将无法提交。要查看为队列配置了哪些主机,请使用cqueues -l。
- -M 内存限制
指定内存限制(以KB 为单位)。以“M”结尾表示限制以 MB 为单位。以“G”结尾表示限制以 GB 为单位。
例子:
csub -M 100G myjob
- -n 最小作业槽[,最大作业槽]
提交并行作业,并指定运行该作业所需的最小和最大处理器数量(某些处理器可能位于同一台多处理器主机上)。如果未指定最大值,则您指定的数字代表要使用的处理器的确切数量。
如果最大处理器数量大于作业提交到的队列的进程限制,AIP 将拒绝该作业(请参阅 cb.yaml中的 processlimit 参数)。
一旦至少有最低数量的处理器可用,作业就会被调度到第一个选定的主机。作业所选的主机名列表在环境变量CB_HOSTS 和 CB_MCPU_HOSTS 中指定。作业本身应该在这些主机上启动并行组件,并在它们之间建立通信,可选地使用 CBEXE。
- -o | -oo 输出文件
指定文件路径。如果指定了-o 选项,则将作业的标准输出附加到指定文件。如果指定了 -oo 选项,则覆盖该文件。如果文件不存在或系统无法写入,则通过邮件发送输出。
如果仅指定文件名,AIP 会将输出文件写入当前工作目录。如果作业启动后在执行主机上无法访问当前工作目录,AIP 会将标准输出文件写入 /tmp/。
如果使用-o而不使用-e,则作业的标准错误将存储在输出文件中。
如果使用-o而不使用-N,则作业报告将作为文件头存储在输出文件中。
如果同时使用-o和-N选项,输出将存储在输出文件中,作业报告将通过邮件发送。作业报告本身不包含输出,但报告会建议您在哪里查找输出。
文件路径可以包含以下动态模式,这些模式区分大小写:
* %J - 作业 ID
* %I - 索引(默认值为 0)
* %P - 项目名称(默认值为“default”)
* %U - 用户名
* %G - 用户组(默认值与用户名相同)
* %H - 第一个执行主机名
* %A - csub -A|-app 中指定的应用程序名称(默认为“_”)
* %D - csub -Jd 中指定的职位描述(默认为“_”)
- -P 项目名称
将作业分配给指定的项目。
例子:
csub-P "rnd project" myjob
- -pack 作业提交文件
提交作业包而不是单个作业。指定作业提交文件的完整路径。在命令行中,此选项与任何其他csub 选项不兼容。在作业提交文件中,每行定义一个作业请求,使用常规 csub 语法,但省略“csub”一词。对于文件中的请求,不支持以下 csub 选项:
-I-Ip-Is-XF-K-h-V
作业提交文件示例:
# 注释行 -o /dev/null -J myjob -R "rusage[license=1]" myjob -o /dev/null -g /my/group -R "rusage[license=1:mem=3500]" herjob -o out -W 1:30 -q queue -P runme ourjob # end...
- -G 用户组名
作业所属的AIP 用户组名称(参见 cb.yaml)。作业的用户必须是指定用户组的直接成员。如果用户属于为公平共享调度定义的多个用户组,则此选项允许用户为作业指定特定的用户组。如果未指定此选项,且用户属于多个用户组,则作业将调度到任意一个用户组下。如果用户所属的用户组未定义公平共享调度,则此选项无效。
- -p 进程限制
将整个作业的进程数限制设置为process_limit。默认值为无限制。超出限制将导致作业终止。
- -proxy
提交需要设置TCP/IP 代理的作业。详情 请参阅/opt/skyform/etc/proxy.yaml。
- -q “队列名称 …”
将作业提交到指定的队列之一。如果只提交单个队列,引号可省略。如需查看可用队列的列表,请使用cqueues。
当指定队列名称列表时,AIP 会根据作业的资源限制和其他限制(例如请求的主机、您对队列的可访问性、队列状态(关闭或打开)、队列是否可以接受独占作业等),从列表中为您的作业选择最合适的队列。队列的考虑顺序与这些队列的列出顺序相同。首先列出的队列将被首先考虑。
- -R “res_req” [-R “res_req” …]
在满足指定资源要求的主机上运行作业。资源要求字符串指定作业所需的资源。AIP 使用资源要求来选择作业执行主机。资源要求字符串的大小限制为 512 字节。
资源需求字符串分为以下几个部分。每个部分都有不同的语法。
* 选择部分(select)。选择部分指定选择执行主机的标准
* 排序部分(order)。排序部分指示符合选择条件的主机应如何排序。
* 资源使用情况部分 (rusage)。资源使用情况部分指定任务的预期资源消耗。如果队列配置了 rusage 部分(请查看cqueues -l queue_name 了解配置),则此部分将被忽略。但是,AIP 管理员可以在集群级别设置 job_rusage_override 参数,以启用作业 rusage 覆盖队列 rusage。
* 作业跨越部分(span)。作业跨越部分指示并行作业是否应跨越多个主机。
* 资源组备选选项(same)。并行作业选择的多个主机应具有相同的资源值。
* CPU 和内存亲和性资源部分(affinity)。亲和性部分指定作业的 CPU 和内存绑定要求。
资源需求字符串部分具有以下语法:
select[selection_string]
order[order_string]
same[resource_name]
rusage[usage_string [, usage_string][| usage_string] …]
span[span_string]
每个部分必须按所示方式输入方括号。每个资源需求部分之间必须用空格分隔。
备注
selection_string的最小单元语法为: “资源名 op 值” 或者 “tag”。多个最小单元间可以用“&&“(与)、“||”(或)相连。 资源名或者tag名为 cinfo 输出中RESOURCE_NAME列出名字之一。
op为:==(等于),!=(不等于),<(小于),>(大于),<=(小于或等于),>=(大于或等于)。
tag不能有op和value。
所有的值都不能带单位,如M、G等。mem、swap、tmp的单位为MB。
您可以省略select关键字和方括号。
备注
order_string的语法为:“资源:资源:…”。资源名必须是数值型资源( cinfo 的输出TYPE为Number)。多个资源排序可以用冒号(:)隔开
备注
same的resource_name必须是数值型或者字串型,不能是tag。
备注
rusage_string的语法为: “数值型资源=值:duration=保留时间分钟:decay=每分钟减少保留的值(mem的单位为MB)”。多个资源保留之间用逗号(,)隔开。
mem,swap,tmp的保留值单位为MB,但可以在数字尾部加G表示GB。
备注
span_string的语法为:“ptile=N” (表示每台主机分配N个作业槽)或 “hosts=1” (表示所有作业槽必须分配在同一台主机上)。
例如:
csub-R "type==x86_64Linux order[ut] rusage[mem=100]" mjob
相当于以下内容:
csub -R "select[type==x86_64Linux] order[ut] rusage[mem=100]" mjob
资源需求中指定的任何特定于运行队列长度的资源(例如r15s、r1m 或 r15m)均指规范化的运行队列长度。如果需要在字符串中包含连字符 (-) 或其他非字母字符,请将文本括在单引号中,例如,csub -R “select[hname!=’node-x01’]”。
select[] 和 rusage[] 部分中的内存 (mem)、交换 (swp) 和临时磁盘空间 (tmp) 限制以 MB 为单位指定。
名为“slots”的资源是 AIP 系统中的预定义资源。此资源在任何命令中均不可见。它可用于根据空闲作业槽的数量对候选作业执行主机进行排序。要提交在具有更多空闲作业槽的主机上运行的作业(即所谓的“条带化”调度策略),请执行以下操作:
csub-R "order[slots]" mjob
提交在具有较少空闲作业槽的主机上运行的作业(所谓的“打包”调度策略):
csub-R "order[-slots]" mjob
另一个内置资源是“maxslots”,它表示在 cb.yaml 中为每个主机配置的 MXJ(最大作业槽位数量)参数。此资源可用于作业提交时的资源需求字符串,或队列配置(cb.yaml)。例如,“order[maxslots]”会根据最大作业槽位数量按降序对要调度的主机进行排序。
要提交在CentOS 6 或 CentOS 7 上运行的作业:
csub-R "centos6 || centos7" mjob
提交一个在负载较轻(CPU 利用率)且至少有 100MB 可用交换空间的 centos7 主机上运行的作业。
csub -R "swap>100 && centos7 order[ut]" mjob
cb.base 中定义了一个名为 bigmem 的资源,在 cb.yaml.AIP 中将其作为 host002 的独占资源。使用以下命令提交在 host002 上运行的作业:
csub-R "bigmem" mjob
或者:
csub-R"defined(bigmem)"mjob
为VCS 应用程序的许可证配置了一个名为 vcs 的静态共享资源。要提交在有可用许可证的主机上运行的作业,请执行以下操作:
csub-R "select[defined(vcs)] rusage[vcs=1]" mjob
以下作业请求在作业期间使用20 MB 内存,并请求 1 个许可证使用 2 分钟:
csub-R"rusage[mem=20, license=1:duration=2]" mjob
以下作业请求20 MB 内存和 50 MB 交换空间,持续 1 小时,以及 1 个许可证,持续 2 分钟:
csub-R "rusage[mem=20:swp=50:duration=1h,license=1:duration=2]" mjob
以下作业请求在作业期间使用20 MB 内存、在 1 小时内使用 50 MB 交换空间以及在 2 分钟内使用 1 个许可证。
csub-R "rusage[mem=20,swp=50:duration=1h,license=1:duration=2]" mjob
以下作业请求50 MB 的交换空间,在 2 小时的持续时间内线性减少保留量,并请求 1 个许可证,有效期为 2 分钟:
csub-R "rusage[swp=50:duration=2h:decay=1,license=1:duration=2]" mjob
以下作业请求两个持续时间相同但衰减不同的资源:
csub-R "rusage[mem=20:duration=30:decay=1,lic=1:duration=30]" mjob
您正在运行应用程序版本1.5(作为名为 app_lic_v15 的资源),以及应用程序版本 2.0.1(作为名为 app_lic_v201 的资源)。2.0.1 版本的许可证密钥与 1.5 版本向后兼容,但 1.5 版本的许可证密钥不适用于 2.0.1 版本。
使用|| 运算符的作业级资源需求规范优先于任何队列级资源需求规范。
如果您只能使用一个版本的应用程序运行作业,请提交作业而不指定其他资源。要提交仅使用 app_lic_v201 的作业,请执行以下操作:
csub-R "rusage[app_lic_v201=1]" mjob
如果您可以使用任一版本的应用程序运行作业,请尝试保留应用程序的 2.0.1 版本。如果不可用,您可以使用 1.5 版本。要提交先尝试 app_lic_v201 再尝试 app_lic_v15 的作业,请执行以下操作:
csub -R "rusage[app_lic_v201=1||app_lic_v15=1]" mjob
如果不同版本的应用程序需要不同的系统资源,您可以在 rusage 字符串中指定其他资源。要提交一个使用 20 MB 内存(app_lic_v201)或 20 MB 内存和 50 MB 交换空间(app_lic_v15)的作业,请执行以下操作:
csub-R "rusage[mem=20:app_lic_v15=1||mem=20:swp=50:app_lic_v201=1]" mjob
使用affinity资源要求的示例:
csub-R "rusage[mem=4734] span[hosts=1] affinity[core(1):cpubind=core]" myjob
AIP 会将作业 myjob 绑定到核心。
csub-R "affinity[core(1,exclusive=(core,alljobs)):cpubind=core:membind=localonly:distribute=pack]"myjob
AIP 将为该作业分配一个独占的内核,即该内核不会与其他作业共享。系统会使用连接到该内核的本地内存,并会选择内核,使其尽可能“打包”到较少的插槽上。
cb.yaml中,如果主机设置了maxslots: cpu,则表示开启了CPU绑定。
备注
AIP 目前仅支持以上两个示例中的affinity符串。
当需要在一台机器上运行的多线程或并行作业(“span[hosts=1]”)使用“-R rusage[mem=…]”指定内存使用量时,内存使用量要求适用于单台机器,而不是乘以作业槽位数量。例如:
csub –n 4 –R "rusage[mem=100] span[hosts=1]" mymulti-threaded-job
调度程序将分配 100MB。
以上规则适用于所有基于插槽的资源,包括交换区、GPU 或任何插件插槽资源。当定义 span[hosts=1] 时,rusage 值将应用于整个作业,而非单个插槽。如果未指定 spen[hosts=1],rusage 值将应用于单个分配的插槽。
当span[hosts=1] 与 rusage[ slot_resource* =…] 同时指定时,不允许使用 min,max 参数,否则调度器会困惑于如何为每个 slot 分配资源。以下作业提交无效:
csub-R "2,3{rusage[gpu=1] span[hosts=1]}" myjob csub-n2,3 -R "rusage[mem=500] span[hosts=1]" myjob
多个主机具有相同的资源值 如果所有主机具有相同的性能或相同的资源,则并行作业(例如MPI 作业)将以最佳方式运行。资源需求的 same[] 部分可用于指示调度程序分配具有相同资源值的主机。
在同一节中定义的资源名称可以是任何内置文本/字符串资源或静态数字资源:type、model、cpuf、maxmem、maxswp、maxtmp、maxslots、ngpus、ncpus,以及通过 RESS 定义的任何外部资源(更多信息请参阅 ress)。例如:
csub -n 64 "same[cpuf]" myjob
分配给该作业的所有主机将具有相同的CPU 系数。
多种资源需求
对于某些应用程序(例如AI 作业),每个应用程序组件都需要不同类型的资源。例如,TensorFlow 的参数服务器只需要 CPU,而 TensorFlow 的作业通常需要 GPU。在这种情况下,资源需求字符串需要包含多个部分。例如:
csub-R "4 {mem>10} 5 {rusage[gpu=1]}" myjob
在上面的例子中,每个资源需求都用括号{} 括起来。括号前面的数字表示该资源需求所需的槽位数量。括号 {} 内的资源需求语法遵循上述规则(select、order、rusage、span 等)。
作业的资源需求和队列中定义的资源需求
队列配置中(参考 cb.yaml)的resspec参数可以定义队列级别的资源需求。作业级的资源需求和队列定义的资源需求的 关系如下:
select[]: 选择主机的过滤器,如mem>100 && ut<0.3,这部分bsub -R里的和队列中resspec定义的是“与”的关系
order[]: 作业定义的order优先对主机排序,然后再按队列resspec里定义的order对主机排序
rusage[]: 作业定义的rusage里的参数覆盖队列中定义的,但作业中定义的值不能大于队列中定义的值,否则作业不能提交。 若cb.yaml中有 cluster: job_rusage_override: yes,队列中定义的rusage值只是缺省值,作业提交的值可以大于队列中 定义的值。
span[]: 作业定义了span,队列resspec中也定义了span,作业将无法调度,只能有一个地方定义span。
same[]: 作业定义same的和队列resspec中的定义的span是“与”的关系。
- -rnc 命令
指定当作业分配被修改(扩展和减少)时在第一个执行主机上调用的可执行文件的完整路径。
例子:
csub -n 4 -rnc /home/u001/jobrnc.sh myjob
- -sp 优先级
指定用户分配的作业优先级,允许用户在队列中对其作业进行排序。优先级的有效值为1 到 100 之间的任意整数。错误的作业优先级会被拒绝。AIP 和队列管理员可以指定 100 以上的优先级。
作业所有者可以更改其自己作业的优先级。AIP 和队列管理员可以更改队列中所有作业的优先级。
作业顺序是确定作业是否符合调度条件的首要考虑因素。无论作业优先级如何,作业仍需遵循所有调度策略。优先级相同的作业将按“先到先得”的顺序进行处理。
可以配置用户分配的作业优先级,并自动提升作业优先级,以自动提高已等待指定时间的作业的优先级。
- -S 堆栈限制
为属于作业的每个进程设置每个进程(软)堆栈段大小限制(KB)(请参阅getrlimit(2))。
- -Si Singularity镜像文件路径
指定要运行的作业的Apptainer /Singularity镜像文件路径。
- -So Singularity_run_options
指定“apptainer run”或“singularity run”命令的选项。
- -Sb Singularity/apptainer_run_bind值
指定Apptainer /Singularity容器可以访问的一组主机目录。一个好的做法是指定 AIP 安装目录(例如 /opt/skyformai、/opt/skyformai_shared)以及任何共享应用程序目录,例如 MPI 目录。
- -t [[月:]日:]时:分
指定作业终止的截止时间。如果LINUX 作业在终止时间仍在运行,则会向该作业发送 SIGUSR2 信号,如果该作业在十分钟内未终止,则会被终止。(有关如何终止这些作业的详细说明,请参阅ckill。)在队列定义中,可以配置“kill_action”(在 cb.yaml 中配置)操作来覆盖ckill默认操作(请参阅 cb.yaml 中的 kill_action 参数)。
终止时间的格式为[[month:]day:]hour:minute,其中数字范围如下:月份 1-12、日期 1-31、小时 0-23、分钟 0-59。
必须至少指定两个字段。这些字段的格式假定为“小时:分钟”。如果指定三个字段,则假定为“日:小时:分钟”,如果指定四个字段,则假定为“月:日:小时:分钟”。
- -U 消息模板
作业调度后,使用此处指定的模板向作业发送消息。
message_template 可以包含任何带有以下保留字的字符。这些保留字将自动被 AIP 替换。
“JOBID”:作业 ID 字符串。
“HOSTIP”:作业执行的第一个主机的 IPv4 地址。
“PORT”:作业的第一个分配端口。此端口由 AIP 分配。支持“PORT+100”格式,如果 AIP 分配的端口为 16331,则此值将被替换为“16431”。
“USER”:提交作业的用户名。
“PROXY_IP”:当配置了 AIP 代理并使用“-proxy”选项提交作业时,此字符串将被代理公共 IP 地址替换。
“PROXY_PT”:当配置了 AIP 代理并使用“-proxy”选项提交作业时,此字符串将被作业分配的代理公共端口替换。
在message_template 末尾添加“DELAY=n”。该帖子将在任务调度后“n”秒发布。示例:用户“cadmin”运行以下命令。
csub -U "ssh -o PORT USER@HOSTIPDELAY=10" myjob
发布的消息是:“ssh -o 16331 cadmin@192.168.10.10 ”,作业启动10 秒后消息发布。
- -u 邮件用户
将邮件发送到指定的电子邮件目的地。
- -v swap限制
将整个作业的进程虚拟内存总限制设置为 swap_limit(以KB 为单位,或以 M 或 G 结尾,表示以 MB 或 GB 为单位)。默认值为无限制。超出限制会导致作业终止。
- -w ‘依赖关系表达式’
除非依赖项表达式的计算结果为TRUE,否则 AIP 不会放置您的作业。如果您指定的作业依赖 AIP 无法找到(例如尚未提交的作业),则作业提交会失败。
依赖表达式是由一个或多个依赖条件组成的逻辑表达式。要创建多个条件的依赖表达式,请使用以下逻辑运算符:
&& (和)
|| (或)
! (不是)
如果需要,请使用括号来指示运算顺序。
将依赖项表达式括在单引号(’) 中,以防止 Shell 解释特殊字符(空格、任何逻辑运算符或括号)。如果对依赖项表达式使用单引号,请对其中带引号的项(例如作业名称)使用双引号。
在依赖条件中,除非您是AIP 管理员,否则作业名称仅指定您自己的作业。默认情况下,如果您使用作业名称指定依赖条件,并且您的多个作业具有相同的名称,则所有具有该名称的作业都必须满足测试。如果 cb.yaml 中的 JOB_DEP_LAST_SUB 设置为 1,则测试将针对最近提交的作业进行。使用双引号 (“”) 括起以数字开头的作业名称。在作业名称中,在字符串末尾指定通配符星号 (*),以指示名称以该字符串开头的所有作业。例如,如果您使用 jobA* 作为作业名称,则它指定名为 jobA、jobA1、jobA_test、jobA.log 等的作业。
使用带有依赖关系条件的* 来定义作业阵列元素之间的一对一依赖关系,使得一个数组的每个元素都依赖于另一个数组的相应元素。作业阵列大小必须相同。例如,csub -w “done(myarrayA[*])” -J “myArrayB[1-10]” myJob2 表示,myArrayB 中的元素 1 必须先完成,myArrayA 中的元素 1 才能开始,依此类推。
提交数组后,您还可以使用* 与 cmod 建立一对一的数组元素依赖关系。
如果您想通过数组名称指定数组依赖关系,请在cb.yaml 中设置 JOB_DEP_LAST_SUB。如果您未设置此参数,则当先前的数组中存在同名但索引不同的数组时,作业将被拒绝。
在依赖条件中,变量op表示以下关系运算符之一:
>
>=
<
<=
==
!=
使用以下条件来形成依赖表达式。
done( job_ID| ” job_name ” … )
作业状态为“DONE”。
AIP 指的是内存中 job_name 最旧的作业。
ended( job_ID | “job_name “)
作业状态为EXIT 或 DONE。
exit( job_ID | “job_name” [ , [op] exit_code] )
作业状态为EXIT,并且作业的退出代码满足比较测试。
如果指定没有运算符的退出代码,则测试是否相等(假定==)。
如果您仅指定作业,则任何退出代码都满足测试。
external( job_ID| “job_name“, “状态“)
指定作业状态或消息描述的第一个字(无空格)。仅评估第一个字。
该作业具有指定的作业状态,或者该作业状态的文本以指定的单词开头。
job_ID| “job_name”
如果您指定一个没有依赖条件的作业,则测试针对的是DONE 状态(AIP 默认采用“完成”依赖条件)。
numdone( job_ID,op | *)
对于作业阵列,处于DONE 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
numended( job_ID,op| *)
对于作业阵列,处于DONE 或 EXIT 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
numexit( job_ID ,op| *)
对于作业阵列,处于EXIT 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
numhold( job_ID ,op| *)
对于作业阵列,处于PSUSP 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
numpend( job_ID ,op| *)
对于作业阵列,处于“等待”状态的作业数量满足测试。使用*(不带运算符)指定数组中的所有作业。
numrun( job_ID ,op| *)
对于作业阵列,处于RUN 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
numstart( job_ID ,op| *)
对于作业阵列,处于RUN、USUSP 或 SSUSP 状态的作业数量满足测试。使用 *(不带运算符)指定数组中的所有作业。
post_done( job_ID| “作业名“)
作业状态为POST_DONE(指定作业的后处理已完成且没有错误)。
post_err( job_ID| “作业名“)
作业状态为POST_ERR(指定作业的后处理已完成,但有错误)。
started( job_ID| “作业名“)
作业状态为:
RUN、DONE、或EXIT
PEND 或PSUSP,并且作业有一个正在运行的预执行命令 (csub -E)。
- -W [小时:]*分钟*[/主机名|/主机型号]
设置作业的运行时间限制。如果LINUX 作业的运行时间超过指定的运行时间限制,则会向该作业发送 SIGUSR2 信号,如果该作业在十分钟内未终止,则会被终止。(有关如何终止这些作业的详细说明,请参阅ckill。)在队列定义中,可以配置 TERMINATE 操作来覆盖ckill默认操作(请参阅 cb.yaml中的 JOB_CONTROLS 参数)。
运行限制的格式为[小时: ]分钟。分钟数可以指定为大于 59 的数字。例如,三个半小时可以指定为 3:30 或 210。
您也可以选择提供AIP 中定义的主机名或主机型号名称。必须在运行限制与主机名或型号名称之间插入“/”。(请参阅 cinfo 获取主机型号信息。)
您指定的CPU 时间是标准化 CPU 时间。这样做的目的是,即使作业发送到 CPU 速度更快或更慢的主机,其处理量也大致相同。每当指定标准化 CPU 时间时,执行主机上的实际时间等于指定时间乘以标准化主机的 CPU 因子,然后除以执行主机的 CPU 因子。
如果作业还通过csub -t选项指定了终止时间,AIP 会判断该作业在终止时间之前是否能够实际运行运行限制所允许的指定时间长度。如果不能,则该作业将被中止。如果在 cb.yaml 中设置了 IGNORE_DEADLINE 参数,则会覆盖此行为并忽略运行限制。
- -XF
启用ssh X11 转发。这允许作业通过 ssh X11 隧道将其显示内容发送回作业提交主机。当作业提交主机上的 X 服务器或 VNC 服务器不接受常规 X11 显示请求时(例如,X 服务器或 VNC 服务器以“-nolisten tcp”选项运行),此功能非常有用。
要使用此功能,请确保用户无需输入密码即可通过ssh 连接到任何作业执行主机。
该作业以交互方式运行,即csub 命令将被阻止,直到作业完成为止。输入 Ctrl-C 可终止该作业。
- -Zs
将作业命令文件假脱机到cb.yaml 中 JOB_SPOOL_DIR 参数指定的目录中,并将假脱机文件作为作业的命令文件。
默认情况下,如果未指定JOB_SPOOL_DIR,则输入文件将被缓存到 CB_ENVDIR/../work/data/info 目录。如果 info 目录不存在,AIP 会在缓存文件之前创建该目录。作业完成后,AIP 会删除缓存文件。
嵌入式作业命令(#CSUB)不支持-Zs 选项,因为 AIP 无法确定嵌入式作业命令中要假脱机的第一个命令。
- -h
将命令用法打印到stderr 并退出。
- -V
将AIP 发布版本打印到 stderr 并退出。
- 命令 [参数]
作业可以通过命令行参数command 指定,如果 command 不在命令行中,则可以通过标准输入指定。command可以是提供给 UNIX Bourne shell 的任何内容(参见sh (1) ) 。command 假定以第一个不属于csub选项的单词开头。command 之后的所有参数都作为command的参数提供。
如果命令行中未指定作业,csub将从标准输入读取作业命令。如果标准输入是控制终端,系统会提示用户输入“csub>”输入作业命令。输入完成后,在新行输入 CTRL-D 即可终止。您可以通过标准输入提交多个命令。命令将按照指定的顺序执行。如果行以 #CSUB 开头,也可以在标准输入中指定csub选项;例如,“#CSUB -x”。如果csub命令行和标准输入中都指定了选项,则命令行选项将覆盖标准输入中的选项。用户可以通过在标准输入的第一行指定 shell 路径名来指定运行命令的 shell,例如“#!/bin/csh”。如果第一行未指定 shell,则使用 Bourne shell。标准输入功能可用于假脱机用户的作业脚本;例如,“csub < script”。请参阅下面的示例,了解通过标准输入指定命令的示例。
输出#
如果作业提交成功,则显示作业ID 和作业提交到的队列。
示例#
% csub sleep 2.0
将UNIX 命令 sleep 及其参数 2.0 作为作业提交。
% csub -q short -o my_output “pwd;ls”
将LINUX 命令 pwd 和 ls 作为作业提交到名为 short 的队列,并将作业输出存储在 my_output 文件中。
% csub -m “host1 host3 host8 host9” my_program
提交my_program 在以下候选主机之一上运行:host1、host3、host8 和 host9。
% csub -I ls
提交交互式作业,在用户终端显示ls 的输出。
% csub -Ip vi myfile
提交交互式作业来编辑myfile。
% csub -Is csh
提交一个交互式作业,以启动csh 作为交互式 shell。
% csub -b 20:00 -J my_job_name my_program
提交my_program在晚上8点后运行,并为其分配作业名称my_job_name。
% csub my_script
将my_script 作为作业提交。由于 my_script 被指定为命令行参数,因此 my_script 文件不会被假脱机处理。在作业完成之前对 my_script 文件的后续更改可能会影响此作业。
% csub < default_shell_script
其中default_shell_script 包含:
sim1.exe
sim2.exe
文件default_shell_script 已假脱机,并且由于脚本的第一行未给出 shell 规范,因此命令将在 Bourne shell 下运行。
% csub < csh_script
其中csh_script 包含:
#!/bin/csh
sim1.exe
sim2.exe
csh_script 已假脱机并且命令将在 /bin/csh 下运行。
% csub -q night < my_script
其中my_script 包含:
#!/bin/sh
#CSUB -q test
#CSUB -o outfile -e errfile #我的默认stdout、stderr文件
#CSUB -m "host1 host2" #我的默认候选主机
#CSUB -f "input > tmp" -f "output << tmp"
#CSUB -D 200 -c 10/host1
#CSUB -t 13:00
#CSUB -k "dir 5"
sim1.exe
sim2.exe
该作业被提交到夜间队列而不是测试,因为命令行覆盖了脚本。
% csub -b 20:00 -J my_job_name
csub> sleep 2.00
csub> my_program
csub> CTRL-D
作业命令以交互方式输入。
作业执行环境设置的环境变量#
AIP将大多数环境变量从提交主机传输到执行主机。除了从用户环境继承的环境变量外,AIP 还为作业设置了许多其他环境变量:
CB_ERRORFILE:用 csub -e 指定的错误文件的名称。
CB_JOBID:AIP 分配的作业 ID。
CB_JOBINDEX:属于作业阵列的作业的索引。
CB_CHKPNT_DIR:每次提交检查点作业时都会设置此变量。该变量的值为chkpnt_dir/job_Id,即提交作业时指定的检查点目录的子目录。该子目录由已提交作业的作业 ID 标识。
CB_EFFECTIVE_RUSAGE:当在资源需求字符串的 rusage 部分使用 OR 时,AIP 使用此变量来指示使用哪个 rusage 字符串来调度作业。
CB_HOSTS:用于运行作业的主机列表。对于顺序作业,这只有一个主机名。对于并行作业,这包含多个主机名。
CB_MCPU_HOSTS:与 CB_HOSTS 类似。格式为:“主机1 槽位号1 主机2 槽位号2 …”
CB_JOBPID:作业的进程 ID
CB_SUB_HOST:提交主机的名称。
CB_QUEUE:调度作业的队列名称。
CB_JOBNAME:作业的名称。
CB_MAX_NUM_PROCESSORS:提交作业时请求的最大处理器数量。
CB_PROJECTNAME:该作业的项目名称。
CB_RESTART:如果作业是重新启动的作业或已迁移,则设置为“Y”。否则,此变量未定义。
CB_EXIT_PRE_ABORT:设置为表示退出状态的整数值。如果预执行命令希望中止作业而不是将其重新排队或执行,则应以此值退出。
CB_EXIT_REQUEUE:设置为队列的 REQUEUE_EXIT_VALUES参数。如果队列未配置 REQUEUE_EXIT_VALUES,则此变量不定义。
CB_INTERACTIVE:如果提交作业时使用了 -I 选项,则设置为“Y”。否则,未定义。
CB_SUBCWD:这是提交主机上作业提交的目录。仅当目录未跨机器共享,或者由于账户映射导致执行账户与提交账户不同时,此目录才与PWD 不同。
CUBE_VERSION:表示 AIP 的当前版本。
CB_ALLOCATION:描述调度程序分配的资源的 JSON 数据结构。
CB_PORT:分配给作业的第一个端口。此信息也包含在 CB_ALLOCATION 中。
GPU_ALLOCATION:GPU 分配信息。格式为 hostname:gpuID… 例如:
d16:0,1 d17:2
局限性#
使用帐户映射时,命令 cview 将不起作用。通过 csub 的 -f 选项进行文件传输需要rcp(1) 在提交主机和执行主机之间正常运行。使用 -N 选项请求邮件,和/或使用 -o 和 -e 选项分别指定输出文件和错误文件。
排错#
csub命令无法与调度器通讯时会在stderr上不断显示:AIP scheduler not responding. Keep trying…, 直到可以与调度器通讯,或者用户用Ctrl-C中断命令。
作业提交失败可能会有以下原因:
- Dependency condition syntax error
作业依赖定义语法错误
- Queue does not accept exclusive jobs
作业提交的队列不接受独占作业
- Job submission by root user is disabled
系统配置不允许root用户提交作业
- No job Id can be used now
系统内作业太多,已经没有可用的作业号。这种情况一般是因为cb.yaml里设置的max_jobid太小造成的
- Queue only accepts interactive jobs
队列配置不接受一般作业,只接受交互式作业(csub -I|-Is|-Ip)
- Queue does not accept interactive jobs
队列配置不接受交互式作业
- No such queue
作业提交的队列不存在
- Queue has been closed
作业提交的队列已关闭,不再接受新的作业
- User cannot use the queue
根据队列配置,用户不允许使用该队列
- Invalid host name, host group name or cluster name
作业提交指定的主机名在系统中不存在
- Too many processors are requested
作业需要的作业槽数超过集群内最大可用的作业槽数
- Host or host group is not used by the queue
作业提交指定的主机不在队列配置的主机列表中
- Queue does not have enough per-user job slots
作业所需的作业槽数超过了队列中配置的usermaxslots
- Requests from non AIP host are rejected
作业提交主机不属于AIP集群
- Invalid argument
csub命令行语法错误
- Invalid time specification
提交参数中的时间定义语法错误
- Job start time is later than termination time
作业定义了起始时间和结束时间,结束时间比起始时间早
- Invalid job name
作业名语法错误
- AIP library internal error
AIP内部错误,请联系AIP技术支持
- Failed to fork
提交主机进程数上限太小
- RPC encode or decode error
csub命令与调度器版本不一致
- Invalid resource spec syntax
csub -R定义的资源需求语法错误
- Interactive job cannot be rerunnable
-I参数与-r参数冲突
- User is not in the specified user group
用户不属于-G指定的用户组
- Request is aborted by esub
作业提交没有通过esub验证而失败
- Job group does not exist 或 Invalid or empty job group name
-g指定的作业组不存在或不合法
- Job array index error
-J定义的作业阵列语法错误
- Job array index too large
作业阵列大小超过cb.yaml里定义的max_array_size参数值
- Invalid user priority
-sp定义的值不合法。值应该是1-100
- Invalid minimum and maximum slot requested
-n定义的两个值错误
- Single host job with slot resource reservation can’t define minimum and maximum slot requirements
如果作业请求与作业槽相关的资源(如GPU),而要求作业在一台主机上,同时又定义了伸缩作业(-n min,max), 这种作业定义AIP不支持
- User has too many pending jobs
系统定义了用户最多等待作业的限制(如10000)。提交作业的用户等到作业超过的这个限制
- Key expired
企业版的key过期了,或者无效