本文介绍在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. Leetcode-937-Reorder Log Files-(Easy)

    一.题目描述 You have an array of logs.  Each log is a space delimited string of words. For each log, the ...

  2. Atlas快速入门

    先说一些废话 之前的公司在数据中台的项目上调研决定启用了Atlas作为我们数据血缘管理的工具,让我给大家写了一份Atlas快速入门的文档,所以在这里我将这篇文档以一个纯新手视角的方式再一次优化,希望能 ...

  3. react this指向问题

    在JSX事件函数方法中的 this,默认不会绑定 this指向.如果你忘记绑定,当你调用这个函数的时候 this 的值为 undefined.所以使用时一定要绑定好this的指向. 构造方法中绑定 c ...

  4. 使用python+pytesseract实现图片中文字的识别

    一.安装tesseract 1.下载链接 https://digi.bib.uni-mannheim.de/tesseract/ 2.网盘下载地址 链接:https://pan.baidu.com/s ...

  5. XAF 属性编辑器(PropertyEditor)- 原理篇

    前言 随着 DEV24.1.3 的发布,XAF Blazor 中的属性编辑器(PropertyEditor)也进行了很大的改动,在使用体验上也更接近 WinForm 了,由于进行了大量的封装,理解上没 ...

  6. Java基础(二)继承剖析

    继承剖析 1 若是要直接调用父类的构造方法,不调用子类的方法则需要使用的是super()关键字 Publicclass Child extends Parent {          Public C ...

  7. tampermonkey脚本 百度搜索屏蔽CSDN

    // ==UserScript==// @name         屏蔽CSDN// @namespace    http://tampermonkey.net/// @version      20 ...

  8. STP生成树协议详解

    看了网上关于STP生成树的解释感觉不是很懂,随即自己研究了一番 如有错误,欢迎指正,欢迎留言 ----------------------------------------------------- ...

  9. EthernetIP IO从站设备数据 转 Modbus RTU TCP项目案例

    1         案例说明 1.   设置网关采集EthernetIP IO设备数据 2.   把采集的数据转成Modbus协议转发给其他系统. 2        VFBOX网关工作原理 VFBOX ...

  10. Freertos学习:01 移植到STM32

    --- title: rtos-freertos-01-移植到STM32 EntryName: rtos-freertos-01-porting-on-stm32 date: 2020-06-17 1 ...