0

我正在尝试使用 srun 并行提交多个作业作为 sbatch 中的预处理步骤。循环读取包含 40 个文件名的文件并在每个文件上使用“srun 命令”。但是,并非所有文件都使用 srun 发送出去,其余的 sbatch 脚本会在提交完成后继续执行。真正的 sbatch 脚本更复杂,我不能使用数组,这样就行不通了。这部分应该很简单。

我做了这个简单的测试用例作为健全性检查,它做同样的事情。对于文件列表 (40) 中的每个文件名,它都会创建一个包含“foo”的新文件。每次我使用 sbatch 提交脚本时,都会导致使用 srun 发送不同数量的文件。

#!/bin/sh
#SBATCH --job-name=loop
#SBATCH --nodes=5
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --time=00:10:00
#SBATCH --mem-per-cpu=1G
#SBATCH -A zheng_lab
#SBATCH -p exacloud
#SBATCH --error=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/log_files/test.%J.err
#SBATCH --output=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/log_files/test.%J.out

DIR=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel
SAMPLES=$DIR/samples.txt
OUT_DIR=$DIR/test_out
FOO_FILE=$DIR/foo.txt

# Create output directory
srun -N 1 -n 1 -c 1 mkdir $OUT_DIR

# How many files to run
num_files=$(srun -N 1 -n 1 -c 1 wc -l $SAMPLES)
echo "Number of input files: " $num_files

# Create a new file for every file in listing (run 5 at a time, 1 for each node)
while read F  ;
do
    fn="$(rev <<< "$F" | cut -d'/' -f 1 | rev)" # Remove path for writing output to new directory
    echo $fn
    srun -N 1 -n 1 -c 1 cat $FOO_FILE > $OUT_DIR/$fn.out &
done <$SAMPLES
wait

# How many files actually got created
finished=$(srun -N 1 -n 1 -c 1 ls -lh $OUT_DIR/*out | wc -l)
echo "Number of files submitted: " $finished

这是我上次尝试运行它时的输出日志文件:

Number of input files:  40 /home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/samples.txt
sample1
sample2
sample3
sample4
sample5
sample6
sample7
sample8
Number of files submitted:  8
4

1 回答 1

1

问题在于,它srun会将其重定向stdin到它启动的任务,因此所有启动的命令都会$SAMPLES以不可预知的方式消耗其内容。cat

尝试

srun --input none -N 1 -n 1 -c 1 cat $FOO_FILE > $OUT_DIR/$fn.out &

--input none参数将告诉srun不要与stdin.

于 2020-02-06T12:29:41.487 回答