Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 并行运行子shell并收集退出代码_Linux_Bash_Shell_Scripting - Fatal编程技术网

Linux 并行运行子shell并收集退出代码

Linux 并行运行子shell并收集退出代码,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,通过使用shell脚本,我将一个长数据文件划分为8个文件,并在8个实例中并行运行它们 function_child() { while read -r record do ###process to get the data by arsdoc get## exit 12 ## if get fails## ### fp2pdf ### EXIT 12 ## IF AFP2PDF FAILS ### ### logic ### exit 12 ## if lo

通过使用shell脚本,我将一个长数据文件划分为8个文件,并在8个实例中并行运行它们

function_child()
{
while read -r record
do
 ###process to get the data by arsdoc get##
    exit 12  ## if get fails##
 ### fp2pdf ###
    EXIT 12  ## IF AFP2PDF FAILS ###
 ### logic ###
    exit 12  ## if logic fails####
done < $1
}

## main ##
for file in /$MY_WORK/CCN_split_files/*; do
   proceed_task "$file" &
   PID="$!"
   echo "$PID:$file" | tee $tmp_file
   PID_LIST+="$PID "
done
但它给出了一个错误

 line 49: wait: `23043 23049 ': not a pid or valid job spec
grep: 23049: No such file or directory

有人能帮我一下吗,谢谢。

请参阅:
帮助作业
帮助等待

在代码末尾收集退货状态

pid的
,单位为美元(作业-卢比);做
printf“作业%d处理文件%q仍在运行\n”“$pid”“${pid[pid]}”
完成
对于${jobs-sp中的pid;执行
printf“作业%s处理文件%q已返回状态%d\n”“$pid”“${pid[pid]}”“$(等待“$pid”)”
完成

请参阅:
帮助作业
帮助等待

在代码末尾收集退货状态

pid的
单位为$(作业-rp);执行
printf“作业%d处理文件%q仍在运行\n”“$pid”“${pid[pid]}”
完成
对于${jobs-sp中的pid;执行
printf“作业%s处理文件%q已返回状态%d\n”“$pid”“${pid[pid]}”“$(等待“$pid”)”
完成

等待的参数周围的双引号创建一个字符串。删除引号使shell将字符串分解为单独的PID。

等待的参数周围的双引号创建一个字符串。删除引号使shell将字符串分解为单独的PID。

使用
等待正确的pid编号

function_child() {
    while read -r record; do
        # let's return a random number!
        exit ${RANDOM}
    done <<<'a'
}

mkdir -p my-home/dir
touch my-home/dir/{1..9}

for file in my-home/dir/*; do
    function_child "$file" &
    pid=$!
    echo "Backgrounded: $file (pid=$pid)"
    pids[$pid]=$file
done

for i in "${!pids[@]}"; do
    wait "$i"
    ret=$?
    echo ${pids[$i]} returned with $ret
done
但我认为只要使用
xargs
或其他设计用于并行运行此类作业的工具即可

 printf "%s\n" my-home/dir/* | xargs -n$'\n' -P8 sh -c 'echo "$1"; ###process to get the data by arsdoc get' --
@KamilCuk,任命,更新了代码

PID\u LIST+=“$PID”
创建了一个带空格的长变量。
“${PID\u LIST[@]}”是用于数组的扩展。它的工作方式是,
${PID\u LIST[@]}
只扩展到变量的值
PID\u LIST
,就好像
“$PID\u LIST”
,所以它扩展到
“23043 23049”
。因为它在引号中,所以它在一个元素上迭代,因此它运行
等待“23043 23049”
,因此您会看到错误消息

不推荐:您可以依赖shell空间分割

for process in $PID_LIST; do
     wait "$process"
但只需使用一个数组:

    PID_LIST+=("$PID")
done

for process in "${PID_LIST[@]}"; do
    wait "$process"
如果您觉得使用
pid[$pid]=$file
关联数组不安全,请改用两个数组:

     onlypids+=("$pid")
     files+=("$files")
done

for i in "${!onlypids[@]}"; do
     pid="${onlypids[$i]}"
     file="${files[$i]}"
     wait "$pid"

请注意,按照惯例,大写变量名称用于导出的变量。

对正确的pid编号使用
wait

function_child() {
    while read -r record; do
        # let's return a random number!
        exit ${RANDOM}
    done <<<'a'
}

mkdir -p my-home/dir
touch my-home/dir/{1..9}

for file in my-home/dir/*; do
    function_child "$file" &
    pid=$!
    echo "Backgrounded: $file (pid=$pid)"
    pids[$pid]=$file
done

for i in "${!pids[@]}"; do
    wait "$i"
    ret=$?
    echo ${pids[$i]} returned with $ret
done
但我认为只要使用
xargs
或其他设计用于并行运行此类作业的工具即可

 printf "%s\n" my-home/dir/* | xargs -n$'\n' -P8 sh -c 'echo "$1"; ###process to get the data by arsdoc get' --
@KamilCuk,任命,更新了代码

PID\u LIST+=“$PID”
创建了一个带空格的长变量。
“${PID\u LIST[@]}”是用于数组的扩展。它的工作方式是,
${PID\u LIST[@]}
只扩展到变量的值
PID\u LIST
,就好像
“$PID\u LIST”
,所以它扩展到
“23043 23049”
。因为它在引号中,所以它在一个元素上迭代,因此它运行
等待“23043 23049”
,因此您会看到错误消息

不推荐:您可以依赖shell空间分割

for process in $PID_LIST; do
     wait "$process"
但只需使用一个数组:

    PID_LIST+=("$PID")
done

for process in "${PID_LIST[@]}"; do
    wait "$process"
如果您觉得使用
pid[$pid]=$file
关联数组不安全,请改用两个数组:

     onlypids+=("$pid")
     files+=("$files")
done

for i in "${!onlypids[@]}"; do
     pid="${onlypids[$i]}"
     file="${files[$i]}"
     wait "$pid"

请注意,按照惯例,大写变量名用于导出的变量。

您在注释中提到不希望使用GNU并行,因此此答案适用于没有此限制的人

doit()  {
  record="$1"
  ###process to get the data by arsdoc get##
     exit 12  ## if get fails##
  ### fp2pdf ###
     EXIT 12  ## IF AFP2PDF FAILS ###
  ### logic ###
     exit 12  ## if logic fails####
}
export -f doit

cat /$MY_WORK/CCN_split_files/* |
  parallel --joblog my.log doit
# Field 7 of my.log is the exit value

# If you have an unsplit version of the input you can have GNU Parallel process it:
# cat /$MY_WORK/CNN_big_file |
#   parallel --joblog my.log doit



您在评论中提到您不想使用GNU并行,所以这个答案适用于没有该限制的人

doit()  {
  record="$1"
  ###process to get the data by arsdoc get##
     exit 12  ## if get fails##
  ### fp2pdf ###
     EXIT 12  ## IF AFP2PDF FAILS ###
  ### logic ###
     exit 12  ## if logic fails####
}
export -f doit

cat /$MY_WORK/CCN_split_files/* |
  parallel --joblog my.log doit
# Field 7 of my.log is the exit value

# If you have an unsplit version of the input you can have GNU Parallel process it:
# cat /$MY_WORK/CNN_big_file |
#   parallel --joblog my.log doit



考虑使用GNU并行,而不是重新发明轮子。它将为您划分文件,标记输出,在网络中的多台机器上运行它,并进行错误处理…@马克,Tabk Y.但我不是在寻找GNU,而是在寻找Linux代码来解决。您不想要的只是“代码> xARGS -P8- N1 ARSDOC
?您是否为每一行调用arsdoc?您使用
pid[$pid]=$file
显示代码,现在使用
“${pid\u LIST[@]}”显示代码,这些代码是无关的。GNU和Linux是手牵手的……不确定我理解你的评论,但是你的项目很幸运。考虑使用GNU并行而不是重新发明轮子。它会为你划分你的文件,标记输出,运行在你的网络中的多台机器上,并进行错误处理…@马克,Tabk Y.但是我我不是在寻找GNU,而是在寻找要解决的Linux代码。是否只需要
xargs-P8-n1 arsdoc
?是否为每一行调用arsdoc?您使用
pid[$pid]=$file
显示代码,现在使用
显示代码“${pid\u LIST[@}”
,这些代码是不相关的。GNU和Linux是齐头并进的…我不确定我是否理解你的评论,但祝你的项目好运。在PID索引上循环之前,
等待“${!PID[@]}”
等待所有子项完成。然后你可以循环每个单独的PID以恢复其返回状态。在PID索引上循环之前,
等待”${!pids[@]}“
等待所有子项完成。然后可以循环每个单独的PID以恢复其返回状态。