2017-03-15 6 views
1

So in einem Cluster ich an einem Drehbuch zu arbeiten und ich brauche dies auszuführen:Run mehrere Zeilen gleichzeitig bash

convert_fastaqual_fastq.py -f ITS_C1-5_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C3-2_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C3-3_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C3-5_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C4-5_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C5-1_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C5-4_rRNA.fq -c fastq_q_to_fastaqual 
convert_fastaqual_fastq.py -f ITS_C5-5_rRNA.fq -c fastq_q_to_fastaqual 

Wie Sie sehen können, jede Zeile ist anders und jede Zeile nimmt wie 2 Tage zu laufen. Der Befehl, was es tut, ist ein Sample in zwei verschiedene Formate zu transformieren, tut es aber von Probe zu Probe. Was ich will ist, dass wenn ich das Skript ausführen alle Proben zur gleichen Zeit gleichzeitig ausgeführt werden.

Eine unansehnliche Lösung wäre, eine Datei für jedes Sample zu generieren und sie einzeln auf separaten CPUs im Cluster auszuführen. Ich möchte, dass ein einzelner Job gleichzeitig parallel läuft.

Danke!

+1

Sie können verschiedene Prozesse generieren. Das Anhängen von '&' am Ende jeder Zeile sollte der richtige Weg sein. Wenn Sie Protokolle jeder Instanz verfolgen möchten, sollten Sie sich das 'nohup'-Dienstprogramm ansehen. – ddnomad

+0

sollte ich am Ende ein "warten" hinzufügen? –

+0

konsultieren Sie den Autor einer vollständigen Antwort unten. Persönlich sehe ich keine Notwendigkeit in "warten", aber ich kann etwas verpassen. – ddnomad

Antwort

1

Sie können so etwas tun, um jeden Job im Hintergrund zu starten und dann auf alle zu warten. Das Muster ITS_C?-?_rRNA.fq stimmt mit jedem der von Ihnen angegebenen Jobs überein.

i=0 
for file in ITS_C?-?_rRNA.fq; do 
    convert_fastaqual_fastq.py \ 
     -f "$file" -c fastq_q_to_fastaqual \ 
     1>> job"$i".out \ 
     2>> job"$i".err & 
    ((i++)) 
done 

wait 

Wenn Sie weitere Informationen wünschen, über die Jobs fehlgeschlagen ist, können Sie so etwas wie dies statt wait tun (beachten Sie, dass diese Sie den Überblick behalten erfordert, von denen pid mit dem Datei zugeordnet ist)

for job in $(jobs -p); do 
    if wait "$job"; then 
     printf "job %s succeeded\n" "$job" 
    else 
     printf "job %s failed\n" "$job" 
    fi 
done 
+0

hat es funktioniert! Vielen Dank! –