【原创】在超算/集群上快速进入作业目录

做计算的同学基本都避不开任务调度系统,大到国家超算,小到学院学校等各类小集群都用到任务调度系统。不知道大家有没有这样的经历:在集群上面提交了N多个任务,几个小时后找不到作业目录的情况,如果作业目录比较集中那还好办,找到了一个就都找到了,但是如果作业目录比较分散那就比较惨了,孤独一人在风中边凌乱边疯狂cd。

我找了很多资料也没见到有现成的脚本可用,所以我写了一个简短的shell脚本,可以实现快速进入当前正在计算的作业目录,这个脚本方便了自己的科研生活,同时分享出来也希望能够帮助到大家。

1.PBS系统

PBS (Portable Batch System) 最初由 NASA 的 Ames 研究中心开发,主要为了提供一个能满足异构计算网络需要的软件包,用于灵活的批处理,特别是满足高性能计算的需要。当前在小型集群中PBS任务调度系统是非常常见的,最早的PBS系统是OpenPBS,但是目前已经没有太多后续开发;Torque 是 Clustering 公司接过了 OpenPBS,并给与后续支持的版本,也是我目前使用的资源管理软件,开源到6.1.2版本,之后的版本应该是收费了;PBS Pro目前是一个开源软件,在使用上和 Torque 还是比较接近的。

快速进入作业目录的脚本如下:

###################################################################################
#  Function: Enter the job directory quickly for Torque PBS                       #
#  Created Time: 8/2/2020 15:20                                                   #
#  Usage: cdjob + jobid                                                           #
#    Copy the cdjob function to your .bashrc and source .bashrc.Enjoy!            #
#  Note: The folder name should not contain ",".                                  #
###################################################################################
cdjob()
{
jobid=$(qstat -u ${USER} | tail -n +$(expr $(qstat -u ${USER} | grep -n '\-\-\-\-' | cut -d : -f 1) + 1) | awk '{print $1}' | cut -d . -f 1)
if [ -z $1 ];then
	echo -e "\033[1;32mUsage: cdjob + jobid! \033[0m"
else
	result=$(echo "${jobid}" | grep -Fx $1) > /dev/null
	if [ -z "${result}" ];then
		echo -e "\033[1;32mWarning: Please input a right JobID! \033[0m"
	else
		str=$(qstat -f $1 | grep -A 2 PBS_O_WORK | xargs )
		cd $(echo ${str#*PBS_O_WORKDIR=} | cut -d " " -f 1 | sed 's#.$##')
		ls
	fi
fi
}

脚本本身很好理解,实现方式是通过 qstat -f 命令得到目标任务的详细信息,之后筛选得到工作目录,然后执行cd命令再执行ls命令实现一键进入与目标ID对应的工作目录,脚本的使用方法是:将cdjob函数放在.bashrc文件中之后执行sourc命令使环境变量生效,通过qstat查看自己当前在算的任务,Job ID 一栏的格式是 ID.$HOSTNAME,如 123456.master等,只需要记住数字ID即可,之后可通过 cdjob 123456 快速进入目录。由于使用过于简单,我就不演示使用了。我使用的是 Torque 版本是 6.1.2,其他版本自行测试。不适用于 PBS Pro。

2.TH-2 (吕梁)

我也使用过 TH-2 的吕梁超算中心,天河二的资源管理调度系统是 slurm 的马甲,查看自己在算任务的命令为 yhq,查看任务详细信息的命令为 yhcontrol show xxx,所以快速进入作业目录的代码如下所示,使用方法在PBS那节已经讲的很详细了,在此就不再赘述。需要注意的是,天河2上面我使用等号 “=” 作为分隔符,所以文件夹名称中不能含有 =,我也相信大多数人也不会用 “,” 和 “=”作为文件夹名字吧。

下面贴出脚本内容:

cdjob() {
jobid=$(yhq | grep $USER | awk '{print $1}')
if [ -z $1 ];then
	echo -e "\033[1;32m Usage: cdjob + jobid ! \033[0m"
else
	result=$(echo -e "$jobid\n" | grep -Fx $1) > /dev/null
	if [ "$result" = "" ];then
		echo -e "\033[1;32m Warning: Please input a right JobID! \033[0m"
	else
		cd `yhcontrol show job $1 | grep WorkDir | cut -d "=" -f 2`
		ls
	fi
fi
}

关于 slurm 上快速进入作业目录的方法大师兄早已讲过,详见大师兄教程的A12节,传送门: https://www.bigbrosci.com/2018/12/15/A12_jobID/  ,不过shell脚本也都已经满足了基本需求。

================================最后编辑于2020/8/2================================

你可能感兴趣的:(【原创】在超算/集群上快速进入作业目录)