【问题标题】:Handling SIGPIPE error in snakemake在snakemake中处理SIGPIPE错误
【发布时间】:2017-10-04 15:56:29
【问题描述】:

以下snakemake脚本:

rule all:
    input:
        'test.done'

rule pipe:
   output:
       'test.done'
   shell:
        """
        seq 1 10000 | head > test.done
        """

失败并出现以下错误:

snakemake -s test.snake

Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
    count   jobs
    1   all
    1   pipe
    2

rule pipe:
    output: test.done
    jobid: 1

Error in job pipe while creating output file test.done.
RuleException:
CalledProcessError in line 9 of /Users/db291g/Tritume/test.snake:
Command '
        seq 1 10000 | head > test.done
        ' returned non-zero exit status 141.
  File "/Users/db291g/Tritume/test.snake", line 9, in __rule_pipe
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/concurrent/futures/thread.py", line 55, in run
Removing output files of failed job pipe since they might be corrupted:
test.done
Will exit after finishing currently running jobs.
Exiting because a job execution failed. Look above for error message

returned non-zero exit status 141的解释似乎是说snakemake已经捕获了head发送的SIGPIPE失败。我想严格来说,snakemake 在捕捉失败方面做的是正确的事情,但我想知道是否有可能忽略像这样的某些类型的错误。我有一个使用head 命令的snakemake 脚本,我正在尝试找到解决此错误的方法。

【问题讨论】:

  • 是的,Snakemake 默认设置 pipefail,因为在大多数情况下这是人们隐含的期望。您始终可以通过在 shell 命令前添加 set +o pipefail; 来为特定命令停用它。
  • 谢谢!如果您将其发布为答案,我会接受。

标签: snakemake sigpipe


【解决方案1】:

是的,Snakemake 默认设置 pipefail,因为在大多数情况下这是人们隐含的期望。您始终可以通过在 shell 命令前添加 set +o pipefail; 来为特定命令停用它。

【讨论】:

  • 谢谢。也许只是一个警告... set +o pipefail 应该小心使用,因为它也会使像这样的损坏命令成功 seq 1 10000 | FooBar | head > {output}
  • 没错,这就是 Snakemake 默认启用 pipefail 的原因。
  • 我只是使用替代品awk 'NR<=10' 或`sed -n '1,10p'` 而不是head,以避免@dariober 提到的问题。
【解决方案2】:

一个有点笨拙的解决方案是将|| true 附加到脚本中。这将使命令始终干净地退出,这是不可接受的。要检查脚本是否实际成功,您可以查询数组变量 ${PIPESTATUS[@]} 以确保它包含预期的退出代码:

这个脚本没问题:

seq 1 10000 | head | grep 1 > test.done || true
echo ${PIPESTATUS[@]}
141 0 0

这样不行:

seq 1 10000 | head | FOOBAR > test.done || true
echo ${PIPESTATUS[@]}
0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2014-09-15
    • 2010-09-15
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多