简单(但长)bash 函数中的分段错误(核心已转储)

Segmentation fault (core dumped) in simple (but long) bash function

我正在使用 Nextflow.io 安排数千个分析作业,然后加入输出。

Nextflow 是一种 DSL,它允许我指定渠道和流程以及时间表和 运行 那些。在幕后,它为每个进程创建 bash 脚本,这就是为什么我在这里发布而不是 https://github.com/nextflow-io/nextflow .

我可以提供完整版的脚本,但这是精简版:

#!/bin/bash

nxf_stage() {
    true
    #THIS IS WHERE IT BREAKS
    ...
}    

nxf_main() {
    trap on_exit EXIT
    trap on_term TERM INT USR1 USR2
    # some more prep here
    nxf_stage
    ...
    wait $pid || nxf_main_ret=$?
    ...
    nxf_unstage
}

$NXF_ENTRY

nxf_stage 函数的目的是准备该进程需要的文件。代替上面我所说的中断的评论是大约 76,000 行,如下所示:

rm -f result_job_073241-D_RGB_3D_3D_side_far_0_2019-03-12_03-25-01.json

后跟相同数量的行,如下所示:

ln -s /home/ubuntu/plantcv-pipeline/work/8d/ffe3d29ee581c09d3d25706c238d1d/result_job_073241-D_RGB_3D_3D_side_far_0_2019-03-12_03-25-01.json result_job_073241-D_RGB_3D_3D_side_far_0_2019-03-12_03-25-01.json

当我尝试执行 nextflow 脚本时,出现此错误:

Segmentation fault (core dumped)

我能够通过任一侧的 echo 语句将其调试到该函数,但该函数中的任何内容对我来说似乎都不复杂。事实上,当我剥离其他所有内容并将脚本保留为约 152,000 行 rmln 命令时,它就起作用了。

这种大小的函数是否有可能导致段错误的内存占用?看来每个命令本身就很小

更新:

bash -x 的输出:

+ set -x
+ set -e
+ set -u
+ NXF_DEBUG=0
+ [[ 0 > 1 ]]
+ NXF_ENTRY=nxf_main
+ nxf_main
+ trap on_exit EXIT
+ trap on_term TERM INT USR1 USR2
++ dd bs=18 count=1 if=/dev/urandom
++ base64
++ tr +/ 0A
+ export NXF_BOXID=nxf-1qYK72XftztQW4ocxx3Fs1tC
+ NXF_BOXID=nxf-1qYK72XftztQW4ocxx3Fs1tC
+ NXF_SCRATCH=
+ [[ 0 > 0 ]]
+ touch /home/ubuntu/plantcv-pipeline/work/ec/da7ca4e909b2cc4a74ed8963cc5feb/.command.begin
+ set +u
+ set -u
+ [[ -n '' ]]
+ nxf_stage
Segmentation fault (core dumped)

我在这里找到了解决方案:

本质上,该函数是在堆栈上分配的,并且正在达到软堆栈 space 限制。

运行 ulimit -sS unlimited 允许我提高这个限制。

beforeScript: 'ulimit -sS unlimited' 添加到我的 nextflow 流程是一个成功的解决方法。值得注意的是,这在极端情况下是行不通的,而且非常笨重。我认为真正的解决方案是让 nextflow 为大型输入通道实施更强大的暂存过程。