PBS任务提交脚本与相关命令介绍

本文介绍在Linux 服务器中,通过PBS (Portable Batch System)作业管理系统脚本的方式,提交任务到服务器队列,并执行任务的方法。

最近,需要在学校公用的超算中执行代码任务;而和多数超算设备一样,其也是需要通过作业队列的方式,来提交、管理、排序不同用户的任务,从而使得不同用户都可以较为公平地使用超算设备的资源。由于学校的这个超算是基于PBS 来提交任务的,所以这里就介绍一下撰写PBS 脚本,从而将自己的代码执行需求 提交给服务器(也就是提交任务)的方法。

其中,PBS (Portable Batch System)是一个用于管理、调度计算任务的开源软件;其是一个常用的作业调度系统,用于在大规模计算集群或超级计算机上管理并分配计算资源。在使用时,我们需要首先提交作业到计算集群,PBS将会根据资源可用性、作业优先级等因素进行作业调度和分配。其基本工作流程如下:

  • 用户编写PBS脚本,描述任务的资源需求、执行命令和其他相关信息。
  • 用户使用PBS 命令,将上述编写好的脚本提交到PBS系统。
  • PBS系统根据脚本中作业的资源需求和集群的可用资源情况,将作业放入作业队列中等待执行。
  • 当有可用的计算资源时,PBS系统会选择一个作业并将其分配给相应的计算节点。
  • 作业在计算节点上执行,直到完成,或达到预设的运行时间限制,或任务执行时出错等。

那么接下来,就介绍一下撰写PBS脚本,并基于其提交自己的任务到服务器中的方法。

首先明确一下本文的需求。已知当前在服务器的某个路径下,我们有一个.exe格式的可执行文件(或者是有1Python 代码文件);我们希望后续在超算中,对这个可执行文件(或者Python代码文件)加以运行。

明确了需求,接下来就可以开始操作。首先,如果有需要,我们可以cd进入自己的工作目录。我这里就直接进入存放有.exe格式的可执行文件的目录中;具体代码如下。

bash 复制代码
cd Data_Reflectance_Rec

随后,基于如下代码查看一下当前路径中的文件。ls用于列出目录中的文件和子目录。

bash 复制代码
ls

接下来,基于如下代码创建PBS 脚本,我在这里将其命名为py_task.pbs;其中,.pbs就是PBS 脚本文件的固定拓展名。后续我们向PBS系统提交任务时所用的脚本,就是这个文件。

bash 复制代码
touch py_task.pbs

其中,touch是一个常用的命令,用于创建空白文件或更新已存在文件的访问和修改时间戳。创建完毕后,可以基于如下代码再次看一下当前路径下的文件。

bash 复制代码
ls

执行上述代码,如下图所示。可以看到,py_task.pbs这个PBS脚本文件已经创建完毕了。

创建脚本文件完毕后,我们即可开始编辑这个文件。在这里,我选择基于Vim来编辑,所以执行如下的代码即可。

bash 复制代码
vim py_task.pbs

其中,Vim 是一个强大的文本编辑器,广泛用于命令行环境下代码的编写和文本的编辑。执行上述代码,如下图所示。可以看到,py_task.pbs这个PBS 脚本文件已经被Vim打开了。

接下来,按下i键,进入文本编辑状态;如下图所示。

随后,即可在Vim 中编辑PBS 脚本文件。在这里,我们给出2PBS 脚本文件的模板;其中,第1个模板如下所示。

bash 复制代码
#!/bin/bash
#PBS -N py_task
#PBS -q rtlab1_4
#PBS -l nodes=1:ppn=4
#PBS -l walltime=00:30:00
#PBS -o /data1/home/LiliAircas/Data_Reflectance_Rec/task/py_task.out
#PBS -e /data1/home/LiliAircas/Data_Reflectance_Rec/task/py_task.err
hostname
date "+%Y/%m/%d %H:%M:%S"
python /data1/home/LiliAircas/Data_Reflectance_Rec/code/Alignment.py
date "+%Y/%m/%d %H:%M:%S"
最后注意记得留一个空行

其中,第1行是一个shebang (也称为hashbang )行,指定了用于解释该脚本的解释器。在这里,/bin/bash表示该脚本将由Bash解释器执行。

接下来,从第2行开始的这些#开头的语句,不是注释,而是PBS 作业调度系统的作业指令。这些指令以#PBS开头,指定了不同的选项:-N py_task表示作业的名称为py_task-q rtlab1_4表示将作业提交到rtlab1_4队列中;-l nodes=1:ppn=4表示指定使用1个节点(node)和4个处理器(processor)来运行作业;-l walltime=00:30:00表示作业的最长运行时间为30分钟。随后的2行代码,分别指定了作业的标准输出错误输出所在的文件。

紧接着,随后的2行分别输出当前执行脚本的主机名和当前的日期时间;随后,就开始调用Python 解释器执行Alignment.py这个Python代码文件了。最后,再次输出当前的日期时间,从而使得我们可以基于其大概了解到任务的执行时长。

最后的空行,有的教程说是为了符合脚本文件的规范,提供可读性和结构上的清晰性;也有教程说,有些版本的服务器上如果不加这个空行,会导致无法识别脚本命令。所以为了确保万一,我就加上了1行空行。

上述脚本文件编辑完毕后,如下图所示。这里需要注意:以下截图中有些错误,例如hostname写成了Hostname,且最后一行没有空行。所以对于图片,大家仅仅参考就好;主要还是按照前述文字版代码中的格式,来修改自己的PBS脚本文件。

此外,我们再给出1PBS 脚本执行.exe格式的可执行文件的模板,具体如下。

bash 复制代码
#!/bin/bash
#PBS -N py_task
#PBS -q rtlab1_4
#PBS -l nodes=1:ppn=1
#PBS -l walltime=12:00:00
#PBS -o /data1/home/LiliAircas/Data_Reflectance_Rec/code/py_task.out
#PBS -e /data1/home/LiliAircas/Data_Reflectance_Rec/code/py_task.err
hostname
date "+%Y/%m/%d %H:%M:%S"
cd /data1/home/LiliAircas/Data_Reflectance_Rec/code
./Alignment_Server.exe
date "+%Y/%m/%d %H:%M:%S"

其中,脚本文件的含义前面已经介绍过,这里我们就不再逐一介绍了。

Vim 中编辑完毕自己的脚本文件后,即可保存并退出Vim 。首先,我们需要按下Esc键,退出编辑模式;随后,依次输入:wq3个按键,即可保存并退出VIm

随后,我们即可提交自己的PBS脚本文件到系统中;通过如下的代码即可实现这一功能。

bash 复制代码
qsub py_task.pbs

上述代码会将我们前述编辑好的PBS 脚本文件py_task.pbs提交到PBS作业调度系统中,并开始等待系统分配资源,从而执行作业。执行上述代码,如下图所示。

如果没有问题的话,会出如上图所示的一个编号;这个就是我们刚刚提交的任务的ID

当然,有的时候执行上述代码,会出现如下图所示的错误,即qsub: submit error (Unauthorized Request...)字样的报错。

这种多数是因为将作业提交到了没有权限的队列中导致的;这种情况,需要和服务器的管理人员联系,从而获取权限。

接下来,再介绍几个PBS系统的常用命令。

首先,我们可以通过如下代码,获取当前超算的所有节点的情况。

bash 复制代码
pbsnodes

执行上述代码,如下图所示;可以看到,不同节点的信息都列出来了。

还可以在上述命令的后面,加上具体节点的名称,从而只获取指定节点的信息;如以下代码。

bash 复制代码
pbsnodes cu02

执行上述代码,如下图所示;其中,和上图一样,每一个当前正在该节点 上运行的任务的ID ,都会被显示出来,例如下图中紫色框内就是某个任务的ID

其次,我们可以通过如下代码,获取当前队列中所有任务的情况。

bash 复制代码
qstat

执行上述代码,如下图所示;可以看到有一个任务,这个任务是我自己提交的。在我这里,执行上述代码后只能看到自己提交的任务,而看不到队列中同时存在的、其他人提交的任务------感觉这个可能是我们学校服务器管理人员自行设置的,使得每一个用户仅仅只能看到自己账户中提交的任务。

再次,还可以通过如下的代码,查看队列中任务的详细信息。

bash 复制代码
qstat -f

执行上述代码,如下图所示。

此外,可以通过qdel命令加上任务的ID,删除队列中的指定任务;例如以下代码。

bash 复制代码
qdel 1250752

执行上述代码,并在执行前后通过qstat命令查看队列中的任务,可以看到指定的任务已经被删除了------但是有延迟:执行完qdel后立刻执行qstat的话,可以看到1250752这个任务还是在的;稍后再执行qstat,才可以看到1250752任务消失。

任务执行完毕后,我们就可以依次执行下面的2句代码,打开并查看作业的标准输出、错误输出文件。cat是一个常用的命令,用于连接指定的文件,并打印它们的内容。

bash 复制代码
cat py_task.out
cat py_task.err

执行上述代码,如下图所示。当然,我这里因为待执行的任务存有一些权限上的错误,所以在py_task.err文件中,给出了任务执行过程中的报错内容。

如果没有错误的话,那么大家就可以结合自己任务的实际情况,查看任务执行的结果文件了。

至此,大功告成。

相关推荐
wdxylb6 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20077 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪7 小时前
关于Linux内核中头文件问题相关总结
linux
海绵不是宝宝8178 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
Lovyk9 小时前
Linux 正则表达式
linux·运维
Fireworkitte10 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil90011 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char11 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
繁星¹⁸⁹⁵12 小时前
通过update-alternatives可以实现cuda的多版本切换
服务器
淮北也生橘1213 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习