Обработка ошибки SIGPIPE в 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

В объяснении, возвращенном ненулевом статусе выхода 141, похоже, говорится, что змеиный мастер обнаружил ошибку SIGPIPE, отправленную head, Я полагаю, что, строго говоря, snakemake делает правильную вещь, чтобы поймать неудачу, но мне интересно, можно ли было бы игнорировать некоторые типы ошибок, таких как эта. У меня есть скрипт змеиной магии, использующий head команда и я пытаюсь найти обход этой ошибки.

2 ответа

Решение

Да, Snakemake устанавливает pipefail по умолчанию, потому что в большинстве случаев это то, чего люди неявно ожидают. Вы всегда можете отключить его для определенных команд, добавив set +o pipefail; к команде оболочки.

Как-то неуклюже решение добавить || 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
Другие вопросы по тегам