Linux 并行运行子shell并收集退出代码
通过使用shell脚本,我将一个长数据文件划分为8个文件,并在8个实例中并行运行它们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
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以恢复其返回状态。