【发布时间】:2017-10-24 20:22:59
【问题描述】:
我正在处理作业提交文件的一个小变种。请多多包涵。
提交文件的一般结构是:
#job run time
#cores
#memory
execute program on dir1/input &
execute program on dir2/input &
...
execute program on dir6/input
exit
每个提交文件包含 6 个目录,因为这是分割我们计算机上的核心/内存数量的最佳方式。问题是,如果一个计算完成,那么只有五个计算在运行,但我仍然需要向我们的超级计算机支付相同数量的 SU,就好像我在运行全套六个一样。
我有几百个这样的输入目录,所以我通常会制作几百个带有更新目录号的提交文件。我做了一个小程序,列出了哪些目录开始被操作,但在 96 小时结束之前无法完成,哪些根本没有运行(findincompletefolders.sh)。假设该列表包含在一个文本文件 mustrun.txt 中,我通过运行 findincompletefolders.sh 更新该列表。
我对有经验的程序员的问题是: 您将如何构建一个提交脚本来查询这个 mustrun.txt 并从该列表中启动六个计算,检查(通过 ps)是否已完成对六个目录中的任何一个进行操作,重新运行完整性测试器,以及然后开始在 mustrun.txt 中列出的新目录上运行计算程序?任何帮助将不胜感激。
感谢您的帮助和启发!
编辑: 以下是我今天整理的内容:
#!/bin/bash
#
#BSUB -L /bin/bash -W 96:00 -n 20 -R span[ptile=20] -J SET -e tempeoSET -o tempeoSET
cd $TMPDIR
mkdir $TMPDIR/n1
mkdir $TMPDIR/n2
mkdir $TMPDIR/n3
mkdir $TMPDIR/n4
mkdir $TMPDIR/n5
mkdir $TMPDIR/n6
echo
selecteddir1="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
sleep 4
selecteddir2="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
sleep 4
selecteddir3="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
sleep 4
selecteddir4="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
sleep 4
selecteddir5="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
sleep 4
selecteddir6="/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}"
eval cd $selecteddir1
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n1 &
sleep 4
eval cd $selecteddir2
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n2 &
sleep 4
eval cd $selecteddir3
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n3 &
sleep 4
eval cd $selecteddir4
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n4 &
sleep 4
eval cd $selecteddir5
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n5 &
sleep 4
eval cd $selecteddir6
date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n6
watch -n 500 '
runningcount=`ps -elf |grep -c program`
if [[ $runningcount --eq 7 ]];
then
sleep 300
.
else
find /scratch/user/myname/PROJECT/z* -type d -amin +0.0001|uniq | sed -e 's_/_ _g'|awk '{print $5}' > /scratch/user/myname/PROJECT/tempz
grep -o -c Complete /scratch/user/myname/PROJECT/z*/Completion.log | awk -F: '{if ($2 < 2){print$1}}'|uniq | sed -e 's_/_ _g'|awk '{print $5}' >> /scratch/user/myname/PROJECT/tempz
sort /scratch/user/myname/PROJECT/tempz|uniq -cd|awk '{print $2}' > /scratch/user/myname/PROJECT/unfinishedz
unfinishedz=($(cat /scratch/user/myname/PROJECT/unfinishedz))
RANDOM=$$$(date +%s)
selecteddir1="/scratch/user/myname/PROJECT/"/scratch/user/myname/PROJECT/${unfinishedz[$RANDOM % ${#unfinishedz[@]} ]}""
runningcount=`ps -elf |grep -c program`
cd $selecteddir1
#date >> mylog
/scratch/user/myname/program400/program $TMPDIR/n1 &
.
'
echo
echo working directory
pwd
echo
echo files in directory
ls -l *
echo
exit
最后的循环似乎失败了。我不确定循环本身是问题还是它上面的其他问题。当我提交这份工作时,确实有 6 个随机目录。
【问题讨论】:
-
这听起来像是
parallel -j 6的工作。
标签: linux bash loops submission