简单(但很长)bash函数中的分段故障(内核已转储)

问题描述 投票:1回答:1

我正在使用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语句将其调试到该函数,但是对该函数而言,对我而言似乎没有什么复杂的。确实,当我剥离所有其他内容并将脚本作为rmln命令的〜152,000行离开时,它就起作用了。

这种大小的函数是否有可能造成段错误的内存占用?似乎每个命令本身都很小。

更新:

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)
bash unix segmentation-fault nextflow
1个回答
0
投票
本质上,该函数已在堆栈上分配,并且已达到软堆栈空间限制。

运行ulimit -sS unlimited使我可以增加此限制。

beforeScript: 'ulimit -sS unlimited'添加到我的nextflow过程中是成功的解决方法。值得注意的是,这在极端情况下不起作用,而且很笨重。我认为真正的解决方案将是nextflow为大型输入通道实施更强大的过渡过程。

© www.soinside.com 2019 - 2024. All rights reserved.