2017-10-04 3 views
1

Le script snakemake suivant:Gestion des erreurs SIGPIPE dans snakemake

rule all: 
    input: 
     'test.done' 

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

échoue avec l'erreur suivante:

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 

L'explication retourne état de sortie non nul 141 semble dire que snakemake a attrapé l'échec SIGPIPE envoyé par head. Je suppose que, à proprement parler, snakemake fait ce qu'il faut pour rattraper l'échec, mais je me demande s'il serait possible d'ignorer certains types d'erreurs comme celle-ci. J'ai un script snakemake en utilisant la commande head et j'essaie de trouver une solution de contournement cette erreur.

+1

Oui, Snakemake définit pipefail par défaut, car dans la plupart des cas, ce sont les utilisateurs qui l'attendent implicitement. Vous pouvez toujours le désactiver pour des commandes spécifiques en ajoutant 'set + o pipefail'; 'à la commande shell. –

+0

Merci! Si vous publiez cela comme réponse, je l'accepterai. – dariober

Répondre

2

Oui, Snakemake définit pipefail par défaut, car dans la plupart des cas, c'est ce à quoi les gens s'attendent implicitement. Vous pouvez toujours le désactiver pour des commandes spécifiques en ajoutant set +o pipefail; à la commande shell.

+0

Merci. Peut-être juste une note d'avertissement ... 'set + o pipefail' devrait être utilisé avec soin car il fera réussir aussi une commande cassée comme ceci' seq 1 10000 | FooBar | head> {output} ' – dariober

+0

Exactement, c'est pourquoi Snakemake active pipefail par défaut. –

1

Une solution quelque peu maladroite consiste à ajouter || true au script. Cela fera que la commande quittera toujours proprement, ce qui n'est pas acceptable. Pour vérifier si le script fait succeded vous pouvez interroger la variable tableau ${PIPESTATUS[@]} pour assurer qu'il contient les codes de sortie prévus:

Ce script est ok:

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

Ce n'est pas correct:

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