/bin/sh: --: invalid option

Bonjour,

J'ai un soucis avec mon pipeline Snakemake. Je le lance avec un script bash, tout se passe bien, mais les jobs prennent directement un status "FAILED" quand j'interroge la commande sacct -j JOBID.

J'ai réussi à récupérer un log d'une commande FASTQC et ça donne ceci :

[Fri Jan 27 11:17:00 2023]
Job 30: Fastq-Screen reads contamination checking

    fastq_screen -q --threads 8 --conf config/fastq-screen.conf --aligner bwa --subset 1000 resources/reads/*.fastq.gz &> results/11_Reports/quality/fastq-screen.log

/bin/sh: --: invalid option
Usage: /bin/sh [GNU long option] [option] ...
/bin/sh [GNU long option] [option] script-file ...
GNU long options:
--debug
--debugger
--dump-po-strings
--dump-strings
--help
--init-file
--login
--noediting
--noprofile
--norc
--posix
--protected
--rcfile
--rpm-requires
--restricted
--verbose
--version
Shell options:
-irsD or -c command or -O shopt_option (invocation only)
-abefhkmnptuvxBCHP or -o option
Error submitting jobscript (exit code 2):

Voici la rule correspondante dans mon snakefile :

###############################################################################
rule fastqc_quality_control:
# Aim: reads sequence files and produces a quality control report
# Use: fastqc [OPTIONS] --output [DIR/] [SAMPLE_1.fastq] ... [SAMPLE_n.fastq]
message:
"FastQC reads quality controling"
conda:
FASTQC
threads: get_threads('fastqc_quality_control', 8)
input:
fastq = "resources/reads/"
output:
fastqc = directory("results/00_Quality_Control/fastqc/")
log:
"results/11_Reports/quality/fastqc.log"
shell:
"""
mkdir -p {output.fastqc} 2> /dev/null && fastqc --quiet --threads {threads} --outdir {output.fastqc} {input.fastq}/*.fastq.gz &> {log}
"""
###############################################################################

Pour le job suivant (TRIMMOMATIC), j'ai la même chose :
[Fri Jan 27 11:17:06 2023]
Job 19: Trimming reads for SN21_01630

    trimmomatic PE -threads 12 -phred33 resources/reads/SN21_01630_R1.fastq.gz resources/reads/SN21_01630_R2.fastq.gz results/01_Trimmimg/trimmomatic/SN21_01630_trimmomatic_R1.fastq.gz results/01_Trimmimg/trimmomatic/SN21_01630_trimmomatic_unpaired_R1.fastq.gz results/01_Trimmimg/trimmomatic/SN21_01630_trimmomatic_R2.fastq.gz results/01_Trimmimg/trimmomatic/SN21_01630_trimmomatic_unpaired_R2.fastq.gz ILLUMINACLIP:resources/adapters/TruSeq2-PE.fa:2:30:15 LEADING:20 TRAILING:3 SLIDINGWINDOW:5:20 AVGQUAL:20 MINLEN:50 &>results/11_Reports/trimmomatic/SN21_01630.log

/bin/sh: --: invalid option
Usage: /bin/sh [GNU long option] [option] ...
/bin/sh [GNU long option] [option] script-file ...
GNU long options:
--debug
--debugger
--dump-po-strings
--dump-strings
--help
--init-file
--login
--noediting
--noprofile
--norc
--posix
--protected
--rcfile
--rpm-requires
--restricted
--verbose
--version
Shell options:
-irsD or -c command or -O shopt_option (invocation only)
-abefhkmnptuvxBCHP or -o option
Error submitting jobscript (exit code 2):

Voici la rule correspondante :

###############################################################################
rule trimmomatic:
# Aim : Trimmomatic: a flexible read trimming tool for Illumina NGS data.
message:
"Trimming reads for {wildcards.sample}"
conda:
TRIMMOMATIC
input:
r1="resources/reads/{sample}_R1.fastq.gz",
r2="resources/reads/{sample}_R2.fastq.gz",
adapters = config["trimmomatic"]["adapters"]["truseq2-pe"]
output:
forward_reads = temp("results/01_Trimmimg/trimmomatic/{sample}_trimmomatic_R1.fastq.gz"),
reverse_reads = temp("results/01_Trimmimg/trimmomatic/{sample}_trimmomatic_R2.fastq.gz"),
forwardUnpaired = temp("results/01_Trimmimg/trimmomatic/{sample}_trimmomatic_unpaired_R1.fastq.gz"),
reverseUnpaired = temp("results/01_Trimmimg/trimmomatic/{sample}_trimmomatic_unpaired_R2.fastq.gz")
log:
"results/11_Reports/trimmomatic/{sample}.log"
params:
seedMisMatches = str(config['trimmomatic']['seedMisMatches']),
palindromeClipTreshold = str(config['trimmomatic']['palindromeClipTreshold']),
simpleClipThreshhold = str(config['trimmomatic']['simpleClipThreshold']),
LeadMinTrimQual = str(config['trimmomatic']['LeadMinTrimQual']),
TrailMinTrimQual = str(config['trimmomatic']['TrailMinTrimQual']),
windowSize = str(config['trimmomatic']['windowSize']),
avgMinQual = str(config['trimmomatic']['avgMinQual']),
minReadLen = str(config['trimmomatic']['minReadLength']),
phred = str(config["trimmomatic"]["phred"])
threads: get_threads('trimmomatic', 8)
shell:
"""
trimmomatic PE -threads {threads} {params.phred} {input.r1} {input.r2} {output.forward_reads} {output.forwardUnpaired} {output.reverse_reads} {output.reverseUnpaired} ILLUMINACLIP:{input.adapters}:{params.seedMisMatches}:{params.palindromeClipTreshold}:{params.simpleClipThreshhold} LEADING:20 TRAILING:3 SLIDINGWINDOW:5:20 AVGQUAL:20 MINLEN:50 &>{log}
"""
###############################################################################

La commande snakemake permettant de lancer les jobs est dans un script bash :

CLUSTER='--account=aedes_amplicon --drmaa " --mem={cluster.mem-per-cpus}, -c {cluster.cpus-per-task} -o {cluster.output} -e {cluster.error}" -jobs 250 --configfile config/config.yaml --cluster-config cluster.yaml --drmaa-log-dir slurm_out'

snakemake
--directory ${workdir}/
--snakefile shave.smk
--jobs=$MAX_JOBS
--config os=${os}
--rerun-incomplete
--keep-going
--use-conda
--conda-frontend conda
--prioritize multiqc
--printshellcmds
--configfile ./config/config.yaml
--cluster-config $CLUSTER_CONFIG
--cluster "$CLUSTER"

Je précise que le script bash lançant la commande snakemake (entre autres), est soumis via la commande sbatch.

Pour accéder au script complet : Start_shave_slurm.sh
Pour accéder au snakefile : shave.smk
Pour accéder au cluster.yaml : cluster.yaml

Merci d'avance pour l'aide apportée.

EDIT : je précise également que les fichiers ont été développés sous VScode sous Mac OS Monterey et sont tous LF et non pas CRLF.

EDIT 2 : j'ai lancé la commande snakemake directement et j'ai le même problème. Le snakefile serait impliqué dans le problème.

Cordialement,

Bonjour Loïc,

Est-que les rules fastqc_quality_control et trimmomatic sont les seules à générer une erreur dans votre traitement ?

Julien

Bonjour,

Merci de prendre le temps de me répondre.
Difficile à dire car malheureusement, le pipeline s'arrête là avec un

Error submitting jobscript (exit code 2):

Job failed, going on with independent jobs.
Job failed, going on with independent jobs.
Job failed, going on with independent jobs.
Job failed, going on with independent jobs.
Exiting because a job execution failed. Look above for error message

J'ai essayé de reformater le snakefile avec la commande vim shave.smk -c "set ff=unix" -c ":wq", mais rien n'y fait.

Le message d'erreur est d'autant plus étonnant qu'il n'y a pas de "--" dans la commande de Trimmomatic.

J'ai tenté de lancer la commande snakemake suivante :

snakemake --directory ./ --snakefile shave.smk --jobs=250 --config os="Linux" --rerun-incomplete --keep-going --use-conda --conda-frontend conda --printshellcmds --configfile config.yaml --cluster-config cluster.yaml --cluster '--account=aedes_amplicon --drmaa " -c {cluster.cpus-per-task} -o {cluster.output} -e {cluster.error}" --configfile config/config.yaml --cluster-config cluster.yaml --drmaa-log-dir Cluster_logs'

Je pense que ça vient de tes variables $CLUSTER et $CLUSTER_CONFIG qui se mélangent. Tu appelles déjà --cluster-config dans $CLUSTER.
Et pour moi, on utilise soit --drmaa soit --cluster, pas les 2 en même temps, mais je ne suis pas sure.
Ajoute un echo de tes variables et de ta commande snakemake pour vérifier la syntaxe.
J'ai pas le temps aujourd'hui, désolée, mais je pourrai regarder plus en détail lundi.

Magali

Merci c'est gentil. Effectivement, cette partie là de mon code est confuse. Je vais essayer cela.

EDIT: c'était bien cela. J'ai édité ma commande en :

snakemake --directory ./ --snakefile shave.smk --jobs=250 --config os="Linux" --rerun-incomplete --keep-going --use-conda --conda-frontend conda --prioritize multiqc --printshellcmds --drmaa "--account=aedes_amplicon -c {cluster.cpus} -o {cluster.output} -e {cluster.error}" --cluster-config cluster.yaml --drmaa-log-dir Cluster_logs

Je n'ai plus cette erreur. Malheureusement, snakemake lance bien FASTQC et TRIMMOMATIC en même temps, mais les jobs plantent au bout de 5 secondes.

J'ai testé mes commandes sur mon jeu de données de test après avoir fait un module load et elles fonctionnent bien. Ce n'est donc pas une erreur de syntaxe, mais sans doute un soucis de compréhension de la manière dont DRMAA soumet les jobs. Je n'arrive malheureusement pas à récupérer l'erreur. les logs des commandes sont vides dans mon dossier results/. Une idée de la manière dont je pourrais obtenir les logs avec slurm (à part sacct -j JOBID) ?

J'ai mis à jour les fichiers sur le github pour tenir compte des changements, si vous voulez y jeter un coup d'oeil.
Merci d'avance en tous cas, ça progresse.

Je suspecte un problème de RAM. Il faut ajouter --mem={cluster.mem} (dans les guillemets des options drmaa) pour que la mémoire définie dans cluster.yaml soit bien attribuée au job.
Pour vérifier la mémoire et les cpu alloués, tu peux utiliser la commande seff JOBID.

Bon courage!

Bonjour,
Malheureusement, bien que j'ai ajouté --mem={cluster.mem}, aussi bien en drmaa qu'en sbatch, ça n'a rien changé. Mes jobs sont toujours FAILED et je ne comprends pas pourquoi.

Quand je lance mon script (avec sbatch Start_shave_slurm.sh), snakemake démarre bien et créé bien ses environnements. Il lance les premiers jobs et puis plus rien... J'ai dû tuer les job principaux car cela reste figé sur les premières commandes lancées toute une journée.

Quand je lance la commande seff JOBID, les jobs ont un status FAILED.

Voici la commande Snakemake utilisée dans mon script :

D'abord, un Dry Run (sans soucis) :
snakemake
--directory ./
--snakefile shave.smk
--jobs=$MAX_JOBS
--cores ${max_threads}
--config os=${os}
--rerun-incomplete
--use-conda
--conda-frontend conda
--prioritize multiqc
--dry-run
--quiet
--cluster "sbatch --account=aedes_amplicon --partition={cluster.partition} --mem={cluster.mem} -c {cluster.cpus} -o {cluster.output} -e {cluster.error}"
--cluster-config cluster.yaml
--configfile config.yaml

Puis la commande :
snakemake
--directory ./
--snakefile shave.smk
--jobs=250
--cores ${max_threads}
--config os="Linux"
--rerun-incomplete
--keep-going
--use-conda
--conda-frontend conda
--prioritize multiqc
--printshellcmds
--cluster "sbatch --account=aedes_amplicon --partition={cluster.partition} --mem={cluster.mem} -c {cluster.cpus} -o {cluster.output} -e {cluster.error} --parsable"
--cluster-config cluster.yaml
--cluster-status "./slurm-cluster-status.py"

Au niveau du cluster.yaml (cluster-config), rien d'extravagant. En voici un extrait :
default:
partition: long
cpus: 8
output: "Cluster_logs/{rule}/{rule}.{wildcards}-%j.out"
error: "Cluster_logs/{rule}/{rule}.{wildcards}-%j.err"
mem: 2000

fastqc_quality_control:
cpus: 8
mem: 2000

fastqscreen_contamination_checking:
cpus: 8
mem: 2000

trimmomatic:
cpus: 8
mem: 2000

Ainsi que le config file (un extrait également) :

RESOURCES ----------------------------------------------------------------------------------------

###############################################################################

Aim: Configuration file for shave.smk snakefile

Date: 2022.10.05

Use: Edit or de/comment (#) settings

Latest modification:

Done:

###############################################################################
os: "Linux"
resources:
tmpdir: "$TMPDIR" # Temporary directory (default: '$TMPDIR')

ENVIRONNEMENTS -----------------------------------------------------------------------------------

conda:
Linux: # Conda Linux environement yaml files:
bcftools: "workflow/envs/linux/bcftools-1.15.1.yaml" # Bcftools ver. 1.15.1
bedtools: "workflow/envs/linux/bedtools-2.30.0.yaml" # Bedtools ver. 2.30.0
bowtie2: "workflow/envs/linux/bowtie2-2.4.5.yaml" # Bowtie2 ver. 2.4.5
bwa: "workflow/envs/linux/bwa-0.7.17.yaml" # BWA ver. 0.7.17
cutadapt: "workflow/envs/linux/cutadapt-4.1.yaml" # Cutadapt ver. 4.1
fastq-screen: "workflow/envs/linux/fastq-screen-0.15.2.yaml" # Fastq-Screen ver. 0.15.2
fastqc: "workflow/envs/linux/fastqc-0.11.9.yaml" # FastQC ver. 0.11.9
gawk: "workflow/envs/linux/gawk-5.1.0.yaml" # Awk ver. 5.1.0
lofreq: "workflow/envs/linux/lofreq-2.1.5.yaml" # Lofreq ver. 2.1.5
multiqc: "workflow/envs/linux/multiqc-1.12.yaml" # MultiQC ver. 1.12
samtools: "workflow/envs/linux/samtools-1.15.1.yaml" # Samtools ver. 1.15.1
sickle-trim: "workflow/envs/linux/sickle-trim-1.33.yaml" # Sickle-trim ver. 1.33
gatk: "workflow/envs/linux/gatk-3.8.yaml" # gatk ver. 3.8
gatk4: "workflow/envs/linux/gatk-4.3.0.0.yaml" # gatk ver. 4.3.0.0
picard: "workflow/envs/linux/picard-2.27.5.yaml" # picard ver. 2.27.5
qualimap: "workflow/envs/linux/qualimap-2.2.2.yaml" # Qualimap vers. 2.2.2
trimmomatic: "workflow/envs/linux/trimmomatic-0.39.yaml" # trimmomatic ver. 0.39

ALIGNER ------------------------------------------------------------------------------------------

aligner: "bwa" # Select your favorite aligner (default: 'bwa')

Available options:

'bwa' # Faster (default)

'bowtie2' # Slower, 'sensitivity' requiried and should be set (see below "Bowtie2" options)

MARKDUPLICATE PROGRAM ----------------------------------------------------------------------------

markdup: "picard" # # Select your favorite Mark Duplicate Program (default: 'picard')

Available options:

'picard' # Picard MarkDuplicateSpark (default)

'samtools' # samtools markdup

TRIMMING PROGRAM ---------------------------------------------------------------------------------

trimmer:
"trimmomatic" # Select your favorite trimmer tool

Available options:

"scickle" Trim reads per quality and length, in combination with Cutadapt rule

"trimmomatic" Cut adaptors, trim reads per quality and length.

Et voici un exemple de sortie de commande seff JOBID. On voit bien que la commande plante directement :
Job ID: 31696629
Cluster: core
User/Group: ltalignani/ltalignani
State: FAILED (exit code 1)
Nodes: 1
Cores per node: 8
CPU Utilized: 00:00:00
CPU Efficiency: 0.00% of 00:00:00 core-walltime
Job Wall-clock time: 00:00:00
Memory Utilized: 0.00 MB (estimated maximum)
Memory Efficiency: 0.00% of 1.95 GB (1.95 GB/node)

En tous cas, merci pour l'aide précieuse que vous m'apportez. Il semblerait que ce ne soit pas grand chose, mais c'est bien embêtant.

Je me réponds à moi-même pour mémo car j'ai trouvé la solution.
1/ Il faut que les répertoires de log soient créés avant de lancer la commande snakemake; par défaut, snakemake ne les créé pas (ce qui est normalement le cas).

2/ oubli d'ajouter le mot clé "envmodules" dans les rules utilisant un module.

1 « J'aime »

Merci pour le partage de la solution !