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

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

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

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

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

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

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

cd Data_Reflectance_Rec

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

ls

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

touch py_task.pbs

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

ls

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

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

vim py_task.pbs

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

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

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

#!/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脚本执行可执行文件的模板,具体如下。

#!/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
date "+%Y/%m/%d %H:%M:%S"

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

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

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

qsub py_task.pbs

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

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

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

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

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

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

pbsnodes

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

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

pbsnodes cu02

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

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

qstat

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

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

qstat -f

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

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

qdel 1250752

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

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

cat py_task.out
cat py_task.err

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

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

  至此,大功告成。

Linux服务器PBS任务队列作业提交脚本的使用方法的更多相关文章

  1. 关于Linux服务器磁盘空间占满问题的解决方法

    下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法(/dev/sda3 满了),需要的的朋友参考下吧   下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了), ...

  2. Linux服务器删除乱码文件和文件夹的方法

    Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...

  3. Linux服务器开机自动启动服务或脚本的方法

    由于种种原因我们需要重启服务器或断电重启,服务都得手动一个一个启动太过麻烦,所以专门了解开机自启脚本的设置方法. 方式一: 直接在脚本/etc/rc.d/rc.local(和/etc/rc.local ...

  4. Linux服务器中木马(肉鸡)手工清除方法

    由于自己也碰到过这种情况,刚好看到这篇文章,先转载过来.的确蛮有用的哦. 首先剧透一下后门木马如下: (当然这是事后平静下来后慢慢搜出来的,那个时候喝着咖啡感觉像个自由人) 木马名称 Linux.Ba ...

  5. Linux服务器中木马(肉鸡)手工清除方法(转)

    首先剧透一下后门木马如下: (当然这是事后平静下来后慢慢搜出来的,那个时候喝着咖啡感觉像个自由人) 木马名称 Linux.BackDoor.Gates.5 http://forum.antichat. ...

  6. Linux服务器上的禅道迁移及升级方法(Linux to Linux)

    由于阿里云服务器(Linux系统)到期停用,故需要将部署在该服务器上的禅道迁移到新的Linux服务器上.另外,借此机会,正好可以对旧版禅道进行一次升级.下面总结此次迁移和升级的具体操作方法. 一.禅道 ...

  7. linux服务器系统负载监控-shell脚本

    一.监控服务器系统负载情况: 1.用uptime命令查看当前负载情况(1分钟,5分钟,15分钟平均负载情况) # uptime   15:43:59 up 186 days, 20:04,  1 us ...

  8. linux服务器集群重复批量操作脚本实现

    http://blog.csdn.net/flyinmind/article/details/8074863  在服务器集群的维护中,经常会遇到同样的操作重复执行很多遍的情况,“登录服务器->做 ...

  9. 监控Linux服务器网站状态的SHELL脚本

    1,监控httpd状态码的shell脚本代码. #!/bin/sh #site: www.jquerycn.cn # website[0]=www.jquerycn.cn/chuzu/' #网站1 m ...

  10. linux服务器报Too many open files的解决方法

    linux 上tomcat 服务器抛出socket异常“文件打开太多”的问题 java.net.SocketException: Too many open filesat java.net.Plai ...

随机推荐

  1. Docker Build Cache 缓存清理

    Docker 18.09 引入了 BuildKit ,提升了构建过程的性能.安全.存储管理等能力. docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker ...

  2. iOS 处理HLS视频流

    一.HLS介绍 HLS是苹果主导的音视频传输协议,其主要的格式是一个索引文件(M3U8)+ ts分片的视频文件. HLS的优势是iOS系统天然支持,通过Http 80传输,规避了常规的防火墙问题. 视 ...

  3. java中实现创建目录、创建文件的操作

    一.创建目录 mkdir()--仅创建一层目录,返回true或false. mkdirs()--创建一层或多层目录,返回true或false.   也就是,在通常情况下,使用mkdirs()即可满足创 ...

  4. promise async 和 await

           // promise 是专门用于解决回调地狱的         //         专门用于执行异步程序时使用promise语法         // 语法形式:         // ...

  5. 配置系统未能初始化。“System.Transactions.Diagnostics.DiagnosticTrace”的类型初始值设定项引发异常。

    配置系统未能初始化."System.Transactions.Diagnostics.DiagnosticTrace"的类型初始值设定项引发异常. 1.是检查当前程序的 App.c ...

  6. TiDB 多集群告警监控-中章-融合多集群 Grafana

    author:longzhuquan 背景 随着公司XC改造步伐的前进,越来越多的业务选择 TiDB,由于各个业务之间需要物理隔离,避免不了的 TiDB 集群数量越来越多.虽然每套 TiDB 集群均有 ...

  7. 使用Blazor WebAssembly整合PocketBase的基础项目模板

    使用Blazor WebAssembly整合PocketBase的基础项目模板 在这篇博客文章中,我们将探讨如何创建一个集成PocketBase的基础Blazor WebAssembly项目.我们将涵 ...

  8. 幻想领域图床系统V1.2正式版发布

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 幻想领域图床系统V1.2正式版发布 日期:2018-4-1 ...

  9. 记录一次BoxedApp Packer脱壳解包的记录

    收到朋友的一个求助,一个硬件配套的上位机软件,无法联系到供应商,没有授权,在新电脑安装后无法使用. 简单的记录下过程 首先打开发过来的软件的目录下,一个配置工具,从图片可以判断,是.net winfo ...

  10. Spring Boot 整合 Fisco Bcos(部署、调用区块链合约)

    简介 在上一节,介绍了Spring Boot 整合 Fisco BCOS的最最基础的案例(SpringBoot成功连接Fisco BCOS,并访问其节点网络 --> 文章链接). 本节,咱们继续 ...