linux - 寻找一个奇怪的特定 bash 脚本的灵感

标签 linux bash loops submission

我正在处理作业提交文件的一个小变体。请耐心等待。

提交文件的一般结构是:

 #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/

相关文章:

python - 确定跨行的唯一字典键

linux - rsync 模块路径需要是主目录

linux - 在焦点窗口中确定目录及其路径(Linux)

linux - Bash 脚本在不创建临时文件的情况下保存值

linux - 如何使用 sed 删除 HH :MM:SS. [sss] 的毫秒部分?

bash - For 循环获取 "find"命令的结果

javascript - 循环更改数组并从先前添加的项目开始

linux - 将 cat 的输出重定向到排序

linux - 如何使用复制模块删除ansible中的临时文件

vba - 公式vba中循环的迭代