我正在处理作业提交文件的一个小变体。请耐心等待。
提交文件的一般结构是:
#job run time
#cores
#memory
execute program on dir1/input &
execute program on dir2/input &
...
execute program on dir6/input
exit
每个提交文件包含 6 个目录,因为这是拆分我们计算机上的核心/内存数量的最佳方式。问题是,如果一个计算完成,那么只有五个计算在运行,但我仍然必须向我们的 super 计算机支付相同数量的 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 个随机目录。
最佳答案
使用双符号 && 怎么样?
这样你就可以顺序执行命令。
您可以将这些命令分组在括号 () 中以保留异步执行。
作为额外的 && 检查前一个命令是否以“ok”退出代码退出。如果你不想要这个,你可以使用分号;反而。
是这样的吗?
(execute program on dir1/input && execute something next) &
或许可以通过 while 循环让它变得更加聪明。我不完全了解你的情况。但是这个 while 循环一直循环直到内部命令返回 false(在 bash 中 1 = false,0 = true)。
while [ $? -eq 0]; do execute `next_incomplete`; done
($?: 返回最后执行命令的退出代码)
关于linux - 寻找一个奇怪的特定 bash 脚本的灵感,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46919392/