GNU 并行 --semaphore 在 Ctrl-C 之后卡住并且不释放 --id

问题描述 投票:0回答:1

我是 GNU 并行的一个相当新的用户,我正在使用 Linux 的 Windows 子系统在以下 bash 脚本中运行 sem(GNU 并行 --semaphore):

#!/bin/bash

IFS=,
while read -r col1 col2 col3 col4; do
  echo "started"
  sem --id mutex_1a -j+0 docker run --rm --gpus=all -v "/mnt/c/Work/Imaging/Data/dicomsSorted/$col1:/ukbdata/$col1" fbp:version1 ./runScripts.sh $col1 2 -a stdout;
done < "/mnt/c/Work/Imaging/Data/forPipeline/pidAgeSexSite.csv"
echo "waiting"
sem --wait --id mutex_1a
echo "finished"

如您所见,它使用 --id mutex_1a 调用 sem 并运行一个名为 fbp:version1 的 docker 容器,挂载一个目录并使用几个参数运行 ./runScripts。通常这会产生 12 个“启动”回声并并行地穿过每个回声。

这工作正常,但如果我用 Ctrl-C 打破它,然后尝试重新启动它,那么它就不会运行。它运行一个“echo started””,但实际上并没有启动容器。我认为它正在等待 --id mutex_1a 在作业结束时被释放。

有没有办法告诉sem不要再等待并释放--id?

尝试过:
重新启动 docker 或 wsl 都不会释放 --id。

即使 $col1 的输入集完全不同,也会发生这种情况,因此为 ./runScripts.sh 提供了不同的 mnt 文件夹和参数。

将 id 更改为 mutex_1b 和 mutex_1c 确实可以恢复正常行为,但我担心此策略的寿命,并且我无法在每次中断时手动更改 id。

docker gnu-parallel
1个回答
0
投票

只需删除

~/.parallel/semaphores/id-mutex_1a

为了避免这种情况,您可能需要重写脚本:

doit() {
  col1=$1
  col2=$2
  col3=$3
  col4=$4
  echo Started
  docker run --rm --gpus=all -v "/mnt/c/Work/Imaging/Data/dicomsSorted/$col1:/ukbdata/$col1" fbp:version1 ./runScripts.sh $col1 2 -a stdout
}
export -f doit

parallel --colsep ',' doit < "/mnt/c/Work/Imaging/Data/forPipeline/pidAgeSexSite.csv"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.