计算化学公社
标题:
写了个自动化脚本,各位可以参考用用
[打印本页]
作者Author:
raillgun
时间:
2014-12-26 02:09
标题:
写了个自动化脚本,各位可以参考用用
本帖最后由 raillgun 于 2014-12-30 15:04 编辑
原创内容,转帖须注明出处,虽然也没什么好转的~~
注:
14.12.26 22:05更新:
发现脚本有个错误,代码和附件部分已更新,之前如果有下过的请务必使用新版本,实在抱歉,抱歉!
初玩高斯,参考sob大大的帖子,
实现如下功能:
1、批量执行计算任务,
并且可以按顺序执行任务,比如可以实现先计算1.gjf,4.gjf,5.gjf,再计算2.gjf,3.gjf的功能
2、显示当前任务进度及完成时间
3、
一个任务计算完后判断是否计算成功,分别将成功的和失败的任务输出到pass/和fail/文件夹内(含该任务的gjf、log、chk文件),并且将成功的和失败的任务名分别写入PASSED和FAILED文件内
4、对于计算成功的文件生成可视化.fchk文件及homo和lumo的.cube文件
5、
在计算过程中可以添加当计算完当前所有任务后需要执行的计算任务
,如此的话就可以实现机器的24小时不间断工作了
使用说明如下:
0、先声明一下,
gjf
输入文件里面的
chk
文件目录务必写成相对目录,即
%chk=*.chk
1、将如下所给代码写到一个脚本文件里,如
run.sh
2、在
run.sh
文件同级目录下建一个
task
文件夹
3、在
task
文件夹下面根据自己所需建立几个存放任务的文件夹,建议命名为
0、1、2、3。。。
4、将计算任务文件(即
*.gjf
)按需放到
task
文件夹下面的数字目录下,比如需要计算
1.gjf-5.gjf
,但是根据任务急缓需要先算
1.gjf,4.gjf,5.gjf
,再算2
.gjf,3.gjf
,就把
1、4、5
放到
0
文件夹内,
2、3
放到
1
文件夹内,以此类推
5、执行
sh run.sh
或是
nohup sh run.sh &
(推荐此命令,此命令兼具忽略用户登出信号和将执行结果输出为一个文件的功能)
6、脚本执行后,会在脚本同级目录生成
PASSED
和
FAILED
文件,里面分别包含了计算成功的和失败的任务名,同时如上面所说,将计算成功的和失败的任务的全部文件分别放到
fail/
和
pass/
文件夹内,方便查看
7、在
nohup.out
文件内(若执行命令为
nohup sh run.sh &
)包含了当前执行计算到哪一步,任务是否成功和失败等信息
8、在计算过程中如果想增加计算任务则将需要增加的gjf文件放到还没算到的那个文件夹里,如在
nohup.out
文件内看到现在算到了
1
文件夹里面的东西,那么就将新任务放到
2
文件夹里,如此种种
9、没了,就这些了
代码如下:
#!/bin/bash
#This script can do the Gaussian Project automaticly.
#To use this,here are some tips:
#trees shows below
# ./run.sh
# ./nohup.out
# ./FAILED
# ./PASSED
# ./task/??/*.gjf
# ./pass/
# ./fail/
#
mkdir pass
mkdir fail
cd task
echo "~~HERE WE GO~~"
echo "~~GOOD LUCK~~"
judge () {
grep -q "Normal termination" $log
if [ $? -eq 1 ]
then
mv ${gjf%.*}.* ../../fail/
echo "${gjf%.*} FAILED" >> ../../FAILED
echo -e "!!!${gjf%.*} FAILED!!!\n"
else
formchk $chk
cubegen 0 mo=lumo ${chk%.*}.fchk ${chk%.*}_lumo.cube 100 h
cubegen 0 mo=homo ${chk%.*}.fchk ${chk%.*}_homo.cube 100 h
mv ${gjf%.*}* ../../pass/
echo "${gjf%.*} calculation finished">> ../../PASSED
echo "${gjf%.*} calculation finished"
fi
}
for order in `ls -F | grep /`
do
cd $order
ls | grep -q .gjf
if [ $? -eq 0 ]
then
echo "@@STEP $order BEGIN!@@"
for gjf in *.gjf
do
log="${gjf%.*}.log"
chk="${gjf%.*}.chk"
echo "${gjf%.*} calculation start"
time g09 $gjf
wait
judge
done
echo -e "@@STEP $order END@@\n"
cd ..
else
echo -e "***STEP $order No Input File!!***\n"
cd ..
fi
done
echo "~~ALL DONE! HAVE FUN~~"
复制代码
现在应该没什么bug了,懒人版附件如下,解压即用,如有什么问题欢迎一起讨论~~
以上
(, 下载次数 Times of downloads: 137)
上传 Uploaded
点击下载Click to download
作者Author:
shx
时间:
2014-12-26 05:26
谢谢分享
作者Author:
diaolanxinyu
时间:
2014-12-26 10:50
谢谢分享!
作者Author:
aqhuangry
时间:
2014-12-29 22:31
谢谢:)
作者Author:
小范范1989
时间:
2015-7-9 10:36
楼主好,我想咨询一下,你说的这个:0、先声明一下,gjf输入文件里面的chk文件目录务必写成相对目录,即%chk=*.chk
这个相对目录什么意思。
如果我现在在的位置是/home/globle/fan 同时在这个fan文件夹下面有task文件(里面包含了 0 1 2 这样的文件夹,同时每个文件夹里面有相应的gjf文件)同时还有run.sh文件,那我gjf里面的chk的路径,要写成/0/1.chk,或者是/0/2.chk等等?谢谢楼主
作者Author:
laoman
时间:
2015-7-9 11:12
个人认为这种脚本是要贻误像我这样的高斯新手的……
没必要那么懒吧,除非是在cluster上成批的跑高斯了……
弱弱的说一下,当更正失败任务的时候(可能是关键词写错了),重新执行这个脚本貌似不能跳过已经成功的目录,感觉楼主可以再加一个if [ ! -z ... ] 来判断一下是否已有某个fchk文件。然后是mkdir可以加一个-p参数,再次运行就不报错了。
最后看到这帖子是楼主大半年前深夜发的原创帖子,大赞一个~~
作者Author:
yjcmwgk
时间:
2015-7-13 11:38
laoman 发表于 2015-7-9 11:12
个人认为这种脚本是要贻误像我这样的高斯新手的……
没必要那么懒吧,除非是在cluster上成批的跑高斯了… ...
有可能是国外的说
作者Author:
lastzealot
时间:
2015-7-17 18:40
非常感谢
作者Author:
liyuanhe211
时间:
2015-7-21 01:34
感谢分享,正想自己写一个
作者Author:
kevin
时间:
2016-5-17 22:11
请教楼主一个问题,我用Xshell工具远程连接服务器,用你给的run.sh运行的话,我的计算机关机会不会导致服务器上计算停止?
作者Author:
rtransformation
时间:
2017-4-5 16:06
最近超喜欢玩bash脚本,参考楼主所写,给自己脚本添加写功能,谢谢楼主分享。
作者Author:
exity
时间:
2017-11-12 17:47
感谢楼主提供的好东西,有一个问题,如果所有的作业都跑完了。让服务器放空了一段时间然后把新的作业拷贝到0文件夹里,请问会自动开始吗?还是要重新, nohup sh run.sh一次?
作者Author:
muxijiao
时间:
2017-11-13 09:11
用这个脚本改了个orca的
#!/bin/bash
#This script can do the ORCA Project automaticly.
#To use this,here are some tips:
#trees shows below
# ./run.sh
# ./nohup.out
# ./FAILED
# ./PASSED
# ./task/??/*.gjf
# ./pass/
# ./fail/
#
export PATH=/home/user/openmpi-2.0.2/bin:/home/user/module/ORCA/orca_4_0_0_linux_x86-64/:${PATH};
export LD_LIBRARY_PATH=/home/user/openmpi-2.0.2/lib:${LD_LIBRARY_PATH};
mkdir pass
mkdir fail
cd task
echo "~~HERE WE GO~~"
echo "~~GOOD LUCK~~"
judge () {
grep -q "ORCA TERMINATED NORMALLY" $inp.out
if [ $? -eq 1 ]
then
mv ${inp%.*}.* ../../fail/
echo "${inp%.*} FAILED" >> ../../FAILED
echo -e "!!!${inp%.*} FAILED!!!\n"
else
/home/user/module/ORCA/orca_4_0_0_linux_x86-64/orca_2mkl `basename $inp .inp` -molden
mv ${gjf%.*}* ../../pass/
echo "${inp%.*} calculation finished">> ../../PASSED
echo "${inp%.*} calculation finished"
fi
}
for order in `ls -F | grep /`
do
cd $order
ls | grep -q .inp
if [ $? -eq 0 ]
then
echo "@@STEP $order BEGIN!@@"
for inp in *.inp
do
echo "${inp%.*} calculation start"
time /home/user/module/ORCA/orca_4_0_0_linux_x86-64/orca $inp > $inp.out --allow-run-as-root #非root运行就把--allow-run-as-root删掉
wait
judge
done
echo -e "@@STEP $order END@@\n"
cd ..
else
echo -e "***STEP $order No Input File!!***\n"
cd ..
fi
done
echo "~~ALL DONE! HAVE FUN~~"
复制代码
作者Author:
杜黎小松
时间:
2017-11-13 09:37
谢谢。很实用的脚本,终于解放双手了
欢迎光临 计算化学公社 (http://bbs.keinsci.com/)
Powered by Discuz! X3.3