我正在处理作业提交文件的一个小变体。请耐心等待。
提交文件的一般结构是:
#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个随机目录。
答案 0 :(得分:0)
如何使用双&符号&amp;&amp; ?
这样你就可以顺序执行命令了。
您可以将这些命令分组在括号()中以保留异步执行。
作为额外&amp;&amp;检查上一个命令是否已退出&#39; ok&#39;退出代码。如果你不想要这个,你可以使用分号;代替。
这样的东西?
(execute program on dir1/input && execute something next) &
使用while循环可能会让它变得更加聪明。我并不确切地知道你的情况如何。但是这个while循环循环直到inside命令返回false(在bash 1 = false,0 = true)。
while [ $? -eq 0]; do execute `next_incomplete`; done
($?:返回上次执行的命令的退出代码)