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