cluster
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
cluster [2016/11/21 12:28] – [Enviar un email de aviso] osotolongo | cluster [2020/05/04 10:23] – [Paralelizando un archivo de ordenes] osotolongo | ||
---|---|---|---|
Line 3: | Line 3: | ||
[[https:// | [[https:// | ||
- | El cluster (//brick//) consta | + | El cluster (//brick//) consta de tres nodos (//brick01, brick02 y brick03//). Lo que sigue describe la operativa básica para ejecutar tareas en estas maquinas de una manera ordenada |
{{ :: | {{ :: | ||
Line 188: | Line 188: | ||
mas: https:// | mas: https:// | ||
- | ===== HPC:: | ||
- | [[https:// | ||
- | Hay una forma sencilla de lanzar una lista de scripts utilizando unwrapper escrito en Perl : | + | ---- |
- | ==== Importante: los bricks necesitan los paths ==== | + | **Nota**: Todo lo que estaba hecho en Perl, usando HPC, ha dejado de funcionar. Los modulos dan error. NO obstante, |
- | Para que funcione esto hay que exportar en // | + | ---- |
- | al principio de **todo** habria que añadir: | + | |
- | <code bash> | + | ==== The real life (--multi-prog) ==== |
- | export PERL5LIB=$PERL5LIB:/usr/local/perl5/lib | + | |
- | export PATH=$PATH:/ | + | [[https://www.youtube.com/watch?v=PstrAfoMKlc|Fighter]] |
+ | |||
+ | Vamos a intentar usar todo esto para algo util. Digamos que queremos ejecutar un programa con diferentes argumentos en los nodos del cluster. Para ello usamos **sbatch** | ||
+ | |||
+ | < | ||
+ | $ sbatch test.sh | ||
</ | </ | ||
- | < | ||
- | O bien añadir las lineas al //.bashrc// o //.bash_profile// | + | El script |
- | ==== Generalidades ==== | + | <code bash test.sh> |
+ | # | ||
+ | #SBATCH --time=100 | ||
+ | #SBATCH --ntasks-per-node=20 | ||
+ | #SBATCH -n 50 | ||
+ | #SBATCH --mail-type=ALL | ||
+ | #SBATCH --mail-user=osotolongo | ||
+ | srun --exclusive --multi-prog test.conf | ||
+ | </ | ||
- | Primeramente ha de hacerse | + | Este script lo unico que hace es configurar minimamente **sbatch** y lanzar el comando **srun**. |
+ | * La directiva //time// especifica cuantos minutos dejaremos correr el trabajo. Con // | ||
+ | * Las directivas importantes aqui son // | ||
+ | * Las directivas // | ||
+ | * El comando **srun** lee el archivo // | ||
+ | El archivo // | ||
< | < | ||
- | job1 | + | 0 |
- | job2 | + | 1 |
- | job3 | + | 2 |
- | job4 | + | 3 |
- | # Lets tell slurmrunner.pl to execute jobs5-8 AFTER jobs1-4 have completed | + | 4 test_runner.sh test/ |
- | wait | + | 5 |
- | job5 | + | . |
- | job6 | + | . |
- | job7 | + | . |
- | job8 | + | 45 test_runner.sh test/ |
+ | 46 test_runner.sh test/ | ||
+ | 47 test_runner.sh test/ | ||
+ | 48 test_runner.sh test/ | ||
+ | 49 test_runner.sh test/ | ||
</ | </ | ||
- | Ahora se envia los comandos a slurm para que los ejecute | + | La primer columna debe numerar las tareas, comenzando en **0** y terminando en **n-1**.La segunda columna no es mas que la orden a ejecutar (en el ejemplo // |
- | < | + | === Probando === |
- | $ slurmrunner.pl --infile / | + | |
+ | < | ||
+ | [osotolongo@detritus cluster]$ sbatch test.sh | ||
+ | Submitted batch job 842 | ||
+ | [osotolongo@detritus cluster]$ squeue | ||
+ | JOBID PARTITION | ||
+ | | ||
</ | </ | ||
- | ==== Ejemplo de paralelizacion basica ==== | + | El programa a ejecutar es un script |
- | Supongamos que tenemos | + | |
- | < | + | < |
- | for i in {1..22} | + | [osotolongo@detritus cluster]$ cat test_runner.sh |
+ | #!/bin/sh | ||
+ | file=$1 | ||
+ | count=0 | ||
+ | while [ $count -le 10 ] | ||
do | do | ||
- | vcftools --gzvcf / | + | echo $count >> |
- | plink --vcf HapMap.vcf.chr$i.recode.vcf --make-bed --out HapMap.chr$i | + | |
- | rm HapMap.vcf.chr$i.recode.vcf | + | sleep 50 |
done | done | ||
+ | echo Nice! >> $file | ||
</ | </ | ||
- | Para ejecutar estas tareas en el cluster habria | + | y tambien me he escrito un script para que me escriba el // |
- | < | + | < |
- | for i in {1..22} | + | [osotolongo@detritus cluster]$ cat test_generator.sh |
- | do | + | #!/bin/sh |
- | echo " | + | count=0 |
- | done > dale.in | + | while [ $count -lt 50 ] |
- | echo " | + | |
- | for i in {1..22} | + | |
- | do | + | |
- | echo "plink --vcf / | + | |
- | done >> dale.in | + | |
- | echo " | + | |
- | slurmrunner.pl --infile dale.in | + | |
- | for i in {1..22} | + | |
do | do | ||
- | rm /path/ | + | cn=$((count+1)) |
+ | echo " | ||
+ | ((count++)) | ||
done | done | ||
</ | </ | ||
- | Ojo que, | ||
- | * < | ||
- | * los //rm// probablemente no sea correcto paralelizarlos pues al ser operaciones a disco deberian ejecutarse mas rapido secuencialmente | ||
- | * hay que escribir los paths completos de todos los archivos. los //bricks// no tienen idea de donde esta nada! | ||
- | ==== Ejemplo completo de slurmrunner ==== | + | Luego, corro primero, |
- | (// pero minimo //) | + | |
- | Voy a empezar creando el problema. Digamos que en un directorio tengo unos cuantos archivos y quiero leer su contenido y crear unos archivos nuevos cuyo nombre dependa de ese contenido. Esto es muy basico pero puede ser un buen ejemplo. | + | < |
+ | $ ./ | ||
+ | </ | ||
- | Primero voy a crear los archivos de trabajo | + | que me hace el //test.conf// y luego, |
- | <code bash> | + | |
- | $ mkdir /nas/osotolongo/cluster | + | <code> |
- | $ cd /nas/ | + | $ sbatch test.sh |
- | $ for x in {1..20}; do echo "`shuf -i1-100 -n1`" | + | |
</ | </ | ||
- | De forma que me quedan 20 archivos | + | Los archivos |
- | < | + | |
- | $ $ ls -l | + | < |
- | total 10 | + | [osotolongo@detritus cluster]$ ls test |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file10.txt | + | blah10.txt |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file11.txt | + | blah11.txt |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file12.txt | + | blah12.txt |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file13.txt | + | blah13.txt |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file14.txt | + | blah14.txt |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file15.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file16.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file17.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file18.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file19.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file1.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file20.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file2.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file3.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file4.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file5.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 2 Nov 17 18:32 file6.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file7.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file8.txt | + | |
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file9.txt | + | |
</ | </ | ||
- | que contienen cada uno un numero aleatorio entre 1 y 100. | + | y el contenido es el que debe ser, |
- | < | + | < |
- | $ cat file* | + | [osotolongo@detritus cluster]$ cat test/ |
- | 50 | + | 0 |
- | 25 | + | 1 |
- | 37 | + | 2 |
- | 88 | + | 3 |
- | 51 | + | 4 |
- | 47 | + | 5 |
- | 70 | + | 6 |
- | 84 | + | 7 |
- | 16 | + | |
- | 72 | + | |
- | 45 | + | |
- | 14 | + | |
- | 18 | + | |
- | 69 | + | |
- | 29 | + | |
- | 35 | + | |
8 | 8 | ||
- | 11 | + | 9 |
- | 50 | + | 10 |
- | 40 | + | Nice! |
</ | </ | ||
- | Ahora lo que quiero es leer el contenido de cada archivo y crear un archivo que se llame numberXX.txt, siendo XX el numero que he leido, y que contenga el nombre del archivo original. | + | Los emails también |
- | (// esto es una chorrada pero es ilustrativo //) | + | {{ :: |
- | La solucion sequencial es trivial | + | ==== Hard batching ==== |
- | <code bash> | + | |
- | $ for x in file*; do y=$(cat ${x}); echo ${x} > number${y}.txt; | + | |
- | </ | + | |
- | Pero vamos a suponer que esta tarea consume tiempo y lo que queremos es que esto se haga en los distintos nodos. Asi que creamos un archivo con las distintas ordenes | + | [[https:// |
- | <code bash> | + | El procedimiento anterior funciona OK cuando se lanzan pocas tareas que consuman tiempo. Si hemos de lanzar muchas tareas rapidas lo mejor no es usar un solo //srun// con el switch // |
- | $ for x in file*; do echo " | + | |
- | </code> | + | |
- | de manera | + | Ahora el // |
- | <code bash> | + | <code bash test_generator2.sh> |
- | $ cat dale.in | + | #!/bin/sh |
- | y=$(cat file10.txt); | + | #Creo los batch a ejecutar |
- | y=$(cat file11.txt); echo file11.txt | + | count=0 |
- | y=$(cat file12.txt); | + | while [ $count -lt 50 ] |
- | y=$(cat file13.txt); | + | do |
- | y=$(cat file14.txt); | + | cn=$((count+1)) |
- | y=$(cat file15.txt); | + | |
- | y=$(cat file16.txt); | + | echo "# |
- | y=$(cat file17.txt); echo file17.txt > number${y}.txt | + | echo "# |
- | y=$(cat file18.txt); | + | echo "# |
- | y=$(cat file19.txt); | + | echo "srun test_runner.sh test/blah${cn}.txt" |
- | y=$(cat file1.txt); echo file1.txt > number${y}.txt | + | ((count++)) |
- | y=$(cat file20.txt); | + | done |
- | y=$(cat file2.txt); echo file2.txt | + | #Creo un archivo que ejecute los batch |
- | y=$(cat file3.txt); | + | count=0 |
- | y=$(cat file4.txt); echo file4.txt | + | echo "# |
- | y=$(cat file5.txt); echo file5.txt | + | while [ $count -lt 50 ] |
- | y=$(cat file6.txt); | + | do |
- | y=$(cat file7.txt); | + | cn=$((count+1)) |
- | y=$(cat file8.txt); echo file8.txt | + | |
- | y=$(cat file9.txt); echo file9.txt > number${y}.txt | + | ((count++)) |
+ | done | ||
+ | # Creo un script de aviso | ||
+ | echo "# | ||
+ | echo "# | ||
+ | echo "# | ||
+ | echo "# | ||
+ | echo "srun :" | ||
+ | echo " | ||
+ | chmod +x test.sh | ||
</ | </ | ||
- | + | **Nota:** Cada proceso se ejecuta independientemente y solo envia emails en caso de fallo, para recibir un aviso cuando se termina la ejecucion | |
- | Esto es precisamente | + | Vamos a probarlo, |
- | + | ||
- | pues vamos a probar, | + | |
- | + | ||
- | ** Primero exporto el //enviroment//, ** | + | |
<code bash> | <code bash> | ||
- | export PERL5LIB=$PERL5LIB:/usr/local/perl5/lib | + | [osotolongo@detritus cluster]$ ./test_generator2.sh |
- | export PATH=$PATH:/ | + | [osotolongo@detritus cluster]$ ls |
- | </code> | + | mailme.sh |
+ | test | ||
+ | test.conf | ||
+ | test_generator2.sh | ||
+ | test_generator.sh | ||
+ | [osotolongo@detritus cluster]$ cat test_run_1.sh | ||
+ | #!/bin/bash | ||
+ | #SBATCH -J test | ||
+ | #SBATCH --mail-type=FAIL, | ||
+ | #SBATCH --mail-user=osotolongo | ||
+ | srun test_runner.sh test/ | ||
+ | [osotolongo@detritus cluster]$ cat test.sh | ||
+ | #!/bin/bash | ||
+ | sbatch test_run_1.sh | ||
+ | sbatch test_run_2.sh | ||
+ | sbatch test_run_3.sh | ||
+ | sbatch test_run_4.sh | ||
+ | sbatch test_run_5.sh | ||
+ | ................... | ||
+ | sbatch test_run_50.sh | ||
+ | sbatch --dependency=singleton mailme.sh | ||
- | y ahora lanzo los procesos | + | [osotolongo@detritus cluster]$ ./test.sh |
+ | Submitted batch job 15262 | ||
+ | Submitted batch job 15263 | ||
+ | Submitted batch job 15264 | ||
+ | Submitted batch job 15265 | ||
+ | Submitted batch job 15266 | ||
+ | Submitted batch job 15267 | ||
+ | Submitted batch job 15268 | ||
+ | ............... | ||
- | <code bash> | + | [osotolongo@detritus cluster]$ squeue |
- | $ slurmrunner.pl --infile dale.in --outdir | + | JOBID PARTITION |
- | Submitting job / | + | |
- | With Slurm jobid 99 | + | |
- | Submitting job / | + | 15263 |
- | With Slurm jobid 100 | + | 15264 |
- | Submitting job / | + | 15265 |
- | With Slurm jobid 101 | + | 15266 |
+ | .................... | ||
</ | </ | ||
- | El sistema ha repartido todos los trabajos entre los nodos y los ha lanzado. | + | {{:: |
- | El slurmrunner ha creado el directorio //test// con todo el output. Y por supuesto ha resuelto el problema planteado: | ||
- | <code bash> | + | ===== Paralelizando un archivo de ordenes ===== |
- | $ ls | + | |
- | dale.in | + | |
- | file10.txt | + | |
- | file11.txt | + | |
- | $ cat number* | + | Podemos abstraer todo esto en un script simple para paralelizar las ordenes escritas en un solo archivo. |
- | file7.txt | + | |
- | file20.txt | + | |
- | file18.txt | + | |
- | file2.txt | + | |
- | file11.txt | + | |
- | file4.txt | + | |
- | file5.txt | + | |
- | file12.txt | + | |
- | file9.txt | + | |
- | file1.txt | + | |
- | file15.txt | + | |
- | file8.txt | + | |
- | file14.txt | + | |
- | file3.txt | + | |
- | file16.txt | + | |
- | file19.txt | + | |
- | file17.txt | + | |
- | file13.txt | + | |
- | file6.txt | + | |
- | </ | + | |
- | ==== Enviar un email de aviso ==== | + | Ejemplo, este script, |
- | Si los procesos que queremos enviar consumen mucho tiempo es bastante incomodo tener que estar comprobando todo el tiempo el estado en que se encuentran. Lo mas practico seria que cuando terminaran los jobs nos enviara un email. Hay una manera de configurar slurm para hacer esto cuando se lanza un //sbatch// pero no he encontrado una manera sencilla de hacerlo con // | + | <code perl slurmize.pl> |
- | + | ||
- | El problema es que los jobs se envian a los nodos y la unica manera que ver que esta pasando es utilizando //squeue//. Asi que lo que he hecho es monitorizar que cuando todos los jobs terminen se envíe un email. | + | |
- | + | ||
- | ++++ Tambien esta hecho en bash pero no queda limpio | | + | |
- | <code bash> | + | |
- | $ cat / | + | |
- | #!/bin/sh | + | |
- | ARGS=' | + | |
- | if [ -z " | + | |
- | ARGS=' | + | |
- | fi | + | |
- | msg=$(cat -- $ARGS) | + | |
- | u=$(echo $USER | cut -c1-8) | + | |
- | a=$(squeue | grep -v JOBID) | + | |
- | while [ ! -z "${a// }" ]; do a=$(squeue | grep $u); done | + | |
- | if [ ! -z " | + | |
- | </ | + | |
- | ++++ | + | |
- | + | ||
- | <code perl mail_after_queue.pl> | + | |
# | # | ||
- | use strict; use warnings; | + | use strict; |
- | use Mail:: | + | use warnings; |
- | use Data::Dump qw(dump); | + | |
- | sub achtung { | + | #Cambiar aqui el tiempo maximo de ejecucion |
- | my @adv = @_; | + | my $time = '3:0:0'; |
- | + | ||
- | | + | |
- | from => " | + | |
- | + | ||
- | $sender-> | + | |
- | subject => $adv[0], | + | |
- | msg => $adv[1]}); | + | |
- | } | + | |
- | my @jobs; my $msg; | + | my $ifile = $ARGV[0]; |
- | my @slurp | + | my $wdir = ' |
- | foreach my $line (@slurp) { | + | mkdir $wdir; |
- | if((my $jobid) | + | my $count |
- | push @jobs, $jobid; | + | open IPDF, "<$ifile" or die "Could not open input file\n$!\n"; |
- | } | + | while (< |
- | $msg.=$line; | + | |
+ | | ||
+ | $ofile | ||
+ | open ORD, ">$ofile"; | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD '# | ||
+ | print ORD "srun $_\n"; | ||
+ | close ORD; | ||
+ | system(" | ||
} | } | ||
- | + | close IPDF; | |
- | my $list_jobs | + | my $orderfile |
- | my $get_jobs = qx/squeue | grep "$list_jobs"/; | + | open ORD, ">$orderfile"; |
- | while($get_jobs){ | + | print ORD '#!/bin/ |
- | $get_jobs = qx/squeue | grep "$list_jobs"/; | + | print ORD '# |
- | sleep 10; #Esto es para que chequee cada 10 segundos | + | print ORD '# |
- | } | + | print ORD '# |
- | + | print ORD '# | |
- | achtung "jobs done", | + | print ORD ": |
+ | close ORD; | ||
+ | my $xorder = ' | ||
+ | exec($xorder); | ||
</ | </ | ||
- | El script se usa añadiendolo tras la salida | + | lee un archivo |
<code bash> | <code bash> | ||
- | $ slurmrunner.pl --infile dale.in --outdir test --jobname test | /nas/ | + | $ ./slurmize.pl ordenes.txt |
</ | </ | ||
- | ==== Logs y troubleshooting ==== | ||
- | Todos los archivos intermedios y los logs estan (segun hemos indicado con //--outdir//) en el directorio //test// | + | donde //ordenes.txt// es cualquier listado de tareas. |
- | <code bash> | + | ==== ejemplo ==== |
- | test/001_test.in | + | * Las ordenes deben ejecutarse dentro del directorio |
- | test/001_test.sh | + | * Escribo las ordenes dentro de un archivo (en este caso //test//) |
- | test/002_test.in | + | * Ejecuto el script dando como argumento el nombre del archivo de ordenes |
- | test/002_test.sh | + | * Las tareas seenvian a los nodos del cluster |
- | test/003_test.in | + | * El output (STDOUT & STDERR) queda dentro del directorio |
- | test/003_test.sh | + | * Tambien pueden mirarse los scripts individuales que quedan en el mismo directorio |
- | test/ | + | |
- | test/ | + | |
- | test/2016-11-17-001_test/2016-11-17-CMD_003.log | + | |
- | test/2016-11-17-001_test/2016-11-17-CMD_004.log | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | test/ | + | |
- | </ | + | |
- | Como puede verse el wrapper ha separado las tareas en grupos que lanza en cada nodo y crea los lanzadores apropiados | ||
<code bash> | <code bash> | ||
- | $ cat test/001_test.in | + | [osotolongo@detritus slurmit]$ pwd |
- | y=$(cat file10.txt); echo file10.txt > number${y}.txt | + | /nas/ |
- | y=$(cat file11.txt); echo file11.txt > number${y}.txt | + | [osotolongo@detritus slurmit]$ cat test |
- | y=$(cat file12.txt); echo file12.txt > number${y}.txt | + | sleep 2000;hostname |
- | y=$(cat file13.txt); echo file13.txt > number${y}.txt | + | sleep 2000;hostname |
- | y=$(cat file14.txt); echo file14.txt > number${y}.txt | + | sleep 2000;hostname |
- | y=$(cat file15.txt); echo file15.txt > number${y}.txt | + | [osotolongo@detritus slurmit]$ ./slurmize.pl test |
- | y=$(cat file16.txt); echo file16.txt > number${y}.txt | + | Submitted batch job 129583 |
- | y=$(cat file17.txt); echo file17.txt > number${y}.txt | + | Submitted batch job 129584 |
- | </ | + | Submitted batch job 129585 |
+ | Submitted batch job 129586 | ||
+ | [osotolongo@detritus slurmit]$ squeue | grep test | ||
+ | 129586 | ||
+ | 129583 | ||
+ | 129584 | ||
+ | 129585 | ||
+ | [osotolongo@detritus slurmit]$ tree | ||
+ | . | ||
+ | ├── slurm | ||
+ | │ ├── sorder_0001.sh | ||
+ | │ ├── sorder_0002.sh | ||
+ | │ ├── sorder_0003.sh | ||
+ | │ ├── test-129583 | ||
+ | │ ├── test-129584 | ||
+ | │ ├── test-129585 | ||
+ | │ └── test_end.sh | ||
+ | ├── slurmize.pl | ||
+ | └── test | ||
- | <code bash> | + | 1 directory, 9 files |
- | $ cat test/ | + | |
- | # | + | |
- | # | + | |
- | #SBATCH --share | + | |
- | #SBATCH --get-user-env | + | |
- | #SBATCH --job-name=001_test | + | |
- | #SBATCH --output=/ | + | |
- | #SBATCH --cpus-per-task=4 | + | |
- | #SBATCH --time=04: | + | |
- | cd / | + | |
- | mcerunner.pl --procs 4 --infile / | + | |
- | </ | + | |
- | Tambien hay una lista de los jobs enviados | ||
- | <code bash> | ||
- | $ cat test/ | ||
- | 2016/11/17 18:50:07: DEBUG Submitted batch job 99 | ||
- | | ||
- | | ||
</ | </ | ||
- | y de informacion sobre los procesos | ||
- | <code bash> | ||
- | $ cat test/ | ||
- | ### y=$(cat file10.txt); | ||
- | |122914|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 00 seconds| | ||
- | ### y=$(cat file11.txt); | ||
- | |122915|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 00 seconds| | ||
- | ### y=$(cat file12.txt); | ||
- | |122916|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 00 seconds| | ||
- | ### y=$(cat file13.txt); | ||
- | |122917|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file14.txt); | ||
- | |122926|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file15.txt); | ||
- | |122927|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file16.txt); | ||
- | |122930|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds | ||
- | ### y=$(cat file18.txt); | ||
- | |65217|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file20.txt); | ||
- | |65220|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file17.txt); | ||
- | |122931|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file2.txt); echo file2.txt > number${y}.txt | ||
- | |65229|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file3.txt); echo file3.txt > number${y}.txt | ||
- | |65230|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file5.txt); echo file5.txt > number${y}.txt | ||
- | |65236|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file4.txt); echo file4.txt > number${y}.txt | ||
- | |65233|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file9.txt); echo file9.txt > number${y}.txt | ||
- | |122991|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file8.txt); echo file8.txt > number${y}.txt | ||
- | |122990|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file6.txt); echo file6.txt > number${y}.txt | ||
- | |122988|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | ### y=$(cat file7.txt); echo file7.txt > number${y}.txt | ||
- | |122989|0|0 years, 00 months, 0 days, 00 hours, 00 minutes, 01 seconds| | ||
- | </ | ||
- | |||
- | y un monton de logs con la salida (incluyendo // | ||
- | |||
- | ==== Docs ==== | ||
- | Mas info en, | ||
- | * https:// | ||
- | * https:// | ||
- | * https:// | ||
- | |||
- | ===== Ejemplo de Begonia ===== | ||
- | <code bash> | ||
- | [bego@detritus bego]$ cat script_GWAS.hapmap.slurm | ||
- | #!/bin/bash | ||
- | |||
- | dirFICHEROSCOMUNES=/ | ||
- | db_name=SHARE_MESA_c1_LVH_founders | ||
- | name=MESA | ||
- | dirwork=/ | ||
- | |||
- | ### Step 1.5 PCA con HapMap (db + HapMap) | ||
- | #Preparo lista de SNPs de DB | ||
- | #Las selecciono por cromosoma de la referencia de HapMap de 1000G | ||
- | |||
- | for i in {1..22} | ||
- | do | ||
- | echo " | ||
- | done > ${dirwork}/ | ||
- | echo " | ||
- | |||
- | for i in {1..22} | ||
- | do | ||
- | echo "plink --vcf ${dirwork}/ | ||
- | done >> ${dirwork}/ | ||
- | echo " | ||
- | |||
- | for i in {1..22} | ||
- | do | ||
- | echo "rm ${dirwork}/ | ||
- | done >> ${dirwork}/ | ||
- | echo " | ||
- | |||
- | slurmrunner.pl --infile ${dirwork}/ | ||
- | |||
- | </ | ||
- | |||
- | **Esto no funcionara nunca!** | ||
- | //jajaja// | ||
- | <code bash> | ||
- | for i in {2..22} | ||
- | do | ||
- | echo " | ||
- | done >> ${dirwork}/ | ||
- | echo " | ||
- | </ | ||
- | |||
- | ==== Pendiente: Slurm templates===== | ||
- | |||
- | < | ||
- | #SBATCH --get-user-env | ||
- | #SBATCH --mail-type=END, | ||
- | #SBATCH --mail-user=myemail@harvard.edu # send-to address | ||
- | </ |
cluster.txt · Last modified: 2020/08/04 10:58 by 127.0.0.1