bash - SLURM下的循环中缺少迭代
问题描述
我有一个简单的代码,它遍历一个文件并做一些简单的计算。下面的代码是一个最大的代码的摘录:不要在此代码中要求任何实用程序,它只是问题的一个最小示例。
#!/bin/bash
#SBATCH --job-name=test
#SBATCH --output=test_%j.out
#SBATCH --error=test_%j.err
#SBATCH --workdir=.
#SBATCH --time=0:5:0
#SBATCH --partition=main
#SBATCH --qos=lowprio
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --requeue
for SM in MB BL
do
while read -r id
do
srun --job-name "Test-${id}" --nodes 1 --ntasks 1 --cpus-per-task 1 ls "$id" 1>&2
echo "${id}"
done < <(grep "$SM" internal.txt | awk '{print $1 "_" $2 "_" $3 ".txt"}') > "test_${SM}.dat"
done
这段代码的合理性是:在一个名为的文件中,internal.txt
我有一个数据列表,我需要将其分成两组,名为MB和BL。我grep
用来搜索每个组,我awk
用来组成文件的基本名称,并将它while
作为id
. 在那个循环中,我srun
用来启动一个命令(ls
在这个例子中),结果,我只输出$id
.
该internal.txt
文件包含:
file 1 BL
file 1 MB
file 2 BL
file 2 MB
file 3 MB
所以预期的输出是两个文件,test_BL.dat
:
file_1_BL.txt
file_2_BL.txt
和test_MB.dat
:
file_1_MB.txt
file_2_MB.txt
file_3_MB.txt
但现实是我得到了这两个文件......只写了第一行,test_BL.dat
:
file_1_BL.txt
和test_MB.dat
:
file_1_MB.txt
我已经知道这srun
与问题有关,因为如果我摆脱srun
并只留下ls
,它会按预期工作:
#!/bin/bash
#SBATCH --job-name=test
#SBATCH --output=test_%j.out
#SBATCH --error=test_%j.err
#SBATCH --workdir=.
#SBATCH --time=0:5:0
#SBATCH --partition=main
#SBATCH --qos=lowprio
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --requeue
for SM in MB BL
do
while read -r id
do
ls "$id" 1>&2
echo "${id}"
done < <(grep "$SM" internal.txt | awk '{print $1 "_" $2 "_" $3 ".txt"}') > "test_${SM}.dat"
done
最后一个代码运行良好,但现在我错过了srun
. 对这里发生的事情有任何想法吗?
注意:列出的文件存在。
解决方案
感谢@Inian,问题解决了!
诀窍是srun
,默认情况下,读取其标准输入以将其广播到它正在启动的不同子进程。它不等待子进程开始从输入中读取,它只是读取其输入并将其保存在缓冲区中,直到有人读取或进程完成(然后数据被丢弃)。
为了解决手头的问题,我们只需要关闭 srun 的标准输入。--input
最简单的方法是通过将参数设置为来使用该参数none
:
srun --input none --job-name "Test-${id}" --nodes 1 --ntasks 1 --cpus-per-task 1 ls "$id" 1>&2
通过使用工具关闭标准输入bash
(即添加<&-
)或重定向/dev/null
到标准输入(< /dev/null
)也可以工作(已测试)。
推荐阅读
- android - 'npx react-native bundle --platform android --dev false...' 为什么我每次都需要运行这个来更新我的发布 APK?
- react-native - 来自函数的 React Native useState 更改不会重新渲染组件
- toggle - 手风琴关闭问题
- reactjs - 如何隐藏 Ant Design 4 日期选择器年份?
- javascript - 为多个 AJAX 调用创建动态变量 (SharePoint Online)
- ruby - Daru::Dataframe 是否有一种本机方法可以根据向量拆分标准将一行拆分为多行?
- ssl - 无法为 SSL/TLS 安全通道 .net 核心建立信任关系
- javascript - Javascript DOM 元素
- arrays - 如何为 SwiftUI 新闻应用设置模型
- ios - ios sqlite 错误:尝试写入只读数据库