Bash gnu并行在while循环失败时重新运行

Bash gnu并行在while循环失败时重新运行,bash,parallel-processing,append,gnu-parallel,Bash,Parallel Processing,Append,Gnu Parallel,假设我们有一个csv文件 1 2 3 4 代码如下: cat A.csv | while read A; do echo "echo $A" > $A.sh echo "$A.sh" done | xargs -I {} parallel --joblog test.log --jobs 2 -k sh ::: {} 以上是一个简化的情况。但大部分都是这样。这里的平行线如下所示: parallel --joblog test.log --jobs 2 -k sh ::: 1.sh

假设我们有一个csv文件

1
2
3
4
代码如下:

cat A.csv | while read A; do

echo "echo $A" > $A.sh

echo "$A.sh"

done | xargs -I {} parallel --joblog test.log --jobs 2 -k sh ::: {}
以上是一个简化的情况。但大部分都是这样。这里的平行线如下所示:

parallel --joblog test.log --jobs 2 -k sh ::: 1.sh 2.sh 3.sh 4.sh
Seq     Host    Starttime       JobRuntime      Send    Receive Exitval Signal  Command
1       :       1506362303.003       0.016      0       22      0       0       doit 1
2       :       1506362303.006       0.013      0       22      0       0       doit 2
3       :       1506362303.026       0.002      0       0       1       0       doit 3
4       :       1506362303.014       0.006      0       22      0       0       doit 4
现在假设3.sh由于某些原因失败。在同一行并行命令中,是否有任何简单的方法可以在当前shell脚本设置中重新运行失败的3.sh?我试过下面的方法,但它不起作用,而且相当长

cat A.csv | while read A; do

echo "echo $A" > $A.sh

echo "$A.sh"

done | xargs -I {} parallel --joblog test.log --jobs 2 -k sh ::: {}

# The above will do this:

# parallel --joblog test.log --jobs 2 -k sh ::: 1.sh 2.sh 3.sh 4.sh

cat A.csv | while read A; do

echo "echo $A" > $A.sh

echo "$A.sh"

done | xargs -I {} parallel --resume-failed --joblog test.log --jobs 2 -k sh ::: {}  

# The above will do this:

# parallel --resume-failed --joblog test.log --jobs 2 -k sh ::: 1.sh 2.sh 3.sh 4.sh
######## 2017-09-25 谢谢你,奥立。我试过以下方法

doit() {
   myarg="$1"

if [ $myarg -eq 3 ]

then
        exit 1

else

echo do crazy stuff with "$myarg"

fi

}
export -f doit



parallel -k --retries 3 --joblog ole.log doit :::: A.csv
它返回如下所示的日志文件:

parallel --joblog test.log --jobs 2 -k sh ::: 1.sh 2.sh 3.sh 4.sh
Seq     Host    Starttime       JobRuntime      Send    Receive Exitval Signal  Command
1       :       1506362303.003       0.016      0       22      0       0       doit 1
2       :       1506362303.006       0.013      0       22      0       0       doit 2
3       :       1506362303.026       0.002      0       0       1       0       doit 3
4       :       1506362303.014       0.006      0       22      0       0       doit 4

但是,我没有看到doit 3按预期重试3次。你能开导一下吗?谢谢

首先:生成.sh文件似乎不是个好主意。您很可能只需创建一个函数即可:

doit() {
   myarg="$1"
   echo do crazy stuff with "$myarg"
}
export -f doit
要重试失败的命令,请使用
--retries

parallel --retries 3 doit :::: file.csv
如果CSV文件有多列,请使用
--colsep

parallel --retries 3 --colsep '\t' doit :::: file.csv
使用此选项:

doit() {
   myarg="$1"

  if [ $myarg -eq 3 ] ; then
      echo do not do crazy stuff with "$myarg"
      exit 1
  else
      echo do crazy stuff with "$myarg"
  fi
}
export -f doit
这将重试“3”作业3次:

parallel -k --retries 3 --joblog ole.log doit ::: 1 2 3 4
它将只记录最后一次。要确信这实际上运行了三次,请无缓冲地运行输出:

parallel -u --retries 3 --joblog ole.log doit ::: 1 2 3 4

谢谢@oletange。我已经试过了,并在原来的帖子中进行了编辑。重试似乎没有如预期的那样有效。你能开导一下吗?谢谢