【发布时间】:2020-05-19 00:25:47
【问题描述】:
通过使用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
如何在发生故障时监控子进程的退出代码和pid。 我在下面尝试过,一旦所有进程都发送到后台,我正在使用“等待”功能等待来自我们的 PID_LIST 的 PID 退出,然后捕获并打印相应的退出状态。
for process in "${PID_LIST[@]}";do
wait "$process"
exit_status=$?
file_name=`egrep $process $tmp_file | awk -F ":" '{print $2}' | rev | awk -F "/" '{print $2}' | rev`
echo "$file_name exit status: $exit_status"
done
但它给出了一个错误
line 49: wait: `23043 23049 ': not a pid or valid job spec
grep: 23049: No such file or directory
谁能帮帮我,谢谢。
【问题讨论】:
-
考虑使用 GNU Parallel 而不是重新发明轮子。它将为您划分文件,标记输出,在网络中的多台机器上运行它并进行错误处理...stackoverflow.com/a/59951897/2836621
-
@Mark,谢谢你。但我不是在找 GNU ,而是在找 Linux 代码来解决。
-
你不想要
xargs -P8 -n1 arsdoc吗?您是否为每一行调用arsdoc?你用pids[$pid]=$file显示代码,现在你用"${PID_LIST[@]}"显示代码,这些代码是不相关的。 -
GNU 和 Linux 携手并进...不确定我是否理解您的评论,但祝您项目顺利。
标签: linux bash shell scripting