This shows you the differences between two versions of the page.
cluster [2016/11/21 13:07] osotolongo [Enviar un email de aviso] |
cluster [2020/08/04 10:58] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Como usar el cluster sin morir en el intento ====== | ||
- | [[https:// | ||
- | |||
- | El cluster (//brick//) consta de momento 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 | ||
- | |||
- | {{ :: | ||
- | |||
- | El directorio // /nas// de detritus se monta como // /home// en cada uno de los //bricks// por lo que todo lo que se modifique en // detritus:/ | ||
- | |||
- | La presentacion inicial (hecha con pinpoint y exportada a pdf) se puede bajar de aqui: http:// | ||
- | |||
- | ===== como hacer que los nodos no pidan password ===== | ||
- | [[https:// | ||
- | |||
- | ** Esto es básico para el funcionamiento correcto del resto de las herramientas ** | ||
- | |||
- | Empezamos creando una clave RSA en nuestro directorio de detritus y moviendo la clave publica a un archivo que podamos identificar facilmente | ||
- | |||
- | <code bash> | ||
- | $ ssh-keygen | ||
- | $ mv $HOME/ | ||
- | </ | ||
- | |||
- | Ahora añadimos esta clave a la lista de claves autorizadas en el HOME de los nodos. Como hasta ahora no hay ninguna se puede hacer con //cp//. En caso de haber alguna se podría hacer con //cat//. Y no podemos olvidarnos de dar los permisos correctos! | ||
- | |||
- | En mi caso: | ||
- | |||
- | <code bash> | ||
- | $ mkdir / | ||
- | $ chmod 700 / | ||
- | $ cp ~/ | ||
- | $ chmod 600 / | ||
- | </ | ||
- | |||
- | A partir de ahora, cuando se entra de // | ||
- | |||
- | ===== como ejecutar la misma orden en varios nodos del cluster (pssh y mpssh) ===== | ||
- | [[https:// | ||
- | |||
- | == pssh == | ||
- | |||
- | - primero crear un archivo con la lista de hosts: | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat host.pssh | ||
- | osotolongo@brick01 | ||
- | osotolongo@brick02 | ||
- | osotolongo@brick03 | ||
- | </ | ||
- | |||
- | - despues ejecutar un comando en todas las maquinas | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ pssh -h host.pssh 'ps ax | grep ssh' | ||
- | [1] 13:11:46 [SUCCESS] osotolongo@brick03 | ||
- | [2] 13:11:46 [SUCCESS] osotolongo@brick02 | ||
- | [3] 13:11:46 [SUCCESS] osotolongo@brick01 | ||
- | </ | ||
- | == mpssh == | ||
- | |||
- | - la syntaxis cambia ligeramente, | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ mpssh -f host.pssh 'ps ax | grep ssh' | ||
- | MPSSH - Mass Parallel Ssh Ver.1.3.3 | ||
- | (c)2005-2013 Nikolay Denev < | ||
- | |||
- | [*] read (3) hosts from the list | ||
- | [*] executing "ps ax | grep ssh" as user " | ||
- | [*] spawning 3 parallel ssh sessions | ||
- | |||
- | brick01 -> 1920 ? Ss 0:00 / | ||
- | brick01 -> 73087 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick01 -> 73090 ? S 0:00 sshd: osotolongo@notty | ||
- | brick01 -> 73091 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick01 -> 73101 ? S 0:00 grep ssh | ||
- | brick02 -> 1887 ? Ss 0:00 / | ||
- | brick02 -> 21242 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick02 -> 21245 ? S 0:00 sshd: osotolongo@notty | ||
- | brick02 -> 21246 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick02 -> 21256 ? S 0:00 grep ssh | ||
- | brick03 -> 1928 ? Ss 0:00 / | ||
- | brick03 -> 21270 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick03 -> 21273 ? S 0:00 sshd: osotolongo@notty | ||
- | brick03 -> 21274 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick03 -> 21284 ? S 0:00 grep ssh | ||
- | |||
- | Done. 3 hosts processed. | ||
- | </ | ||
- | |||
- | ===== o como hacerlo mas interactivo (cluster-ssh) ===== | ||
- | [[https:// | ||
- | |||
- | Una imagen vale mas que mil palabras | ||
- | |||
- | < | ||
- | $ cssh brick | ||
- | </ | ||
- | |||
- | {{ :: | ||
- | |||
- | Esta herramienta permite, cuando se escribe en la ventana comun, escribir lo mismo en todas las terminales abiertas o en una sola si se selecciona expresamente. | ||
- | ===== Slurm ===== | ||
- | [[https:// | ||
- | |||
- | ** srun: ** | ||
- | |||
- | Este comando es capaz de lanzar un proceso en varios nodos del cluster al mismo tiempo | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ srun -N3 -l / | ||
- | 0: brick01 | ||
- | 2: brick03 | ||
- | 1: brick02 | ||
- | </ | ||
- | |||
- | ** sbatch: ** | ||
- | |||
- | Este comando lanza un script (tipicamente una lista de comandos //srun//) en el cluster. Es posible escoger el numero de procesos a lanzar e incluso los nodos en los cuales hacerlo | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | #SBATCH --time=1 | ||
- | / | ||
- | srun -l / | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 30 | ||
- | [osotolongo@detritus ~]$ cat / | ||
- | brick01 | ||
- | 1: brick01 | ||
- | 2: brick02 | ||
- | 4: brick03 | ||
- | 3: brick02 | ||
- | 5: brick03 | ||
- | 0: brick01 | ||
- | 0: / | ||
- | 5: / | ||
- | 3: / | ||
- | 1: / | ||
- | 4: / | ||
- | 2: / | ||
- | </ | ||
- | |||
- | ** squeue:** | ||
- | |||
- | Este comando permite ver los trabajos que se han lanzado e informacion sobre ellos | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | #SBATCH --time=1 | ||
- | / | ||
- | srun -l / | ||
- | sleep 20 | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 35 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | 35 debug test_scr osotolon | ||
- | </ | ||
- | |||
- | |||
- | ** scancel: ** | ||
- | |||
- | OK, y cuando la caguemos podemos usar //scancel// para parar los trabajos. El kill de toda la vida pero a traves de un workload manager | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | / | ||
- | srun -l / | ||
- | sleep 200 | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 36 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | 36 debug test_scr osotolon | ||
- | [osotolongo@detritus ~]$ scancel 36 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | </ | ||
- | |||
- | 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 ==== | ||
- | |||
- | Para que funcione esto hay que exportar en // | ||
- | al principio de **todo** habria que añadir: | ||
- | |||
- | <code bash> | ||
- | export PERL5LIB=$PERL5LIB:/ | ||
- | export PATH=$PATH:/ | ||
- | </ | ||
- | < | ||
- | |||
- | O bien añadir las lineas al //.bashrc// o // | ||
- | |||
- | ==== Generalidades ==== | ||
- | |||
- | Primeramente ha de hacerse un archivo con la lista de comandos a ejecutar. | ||
- | |||
- | < | ||
- | job1 | ||
- | job2 | ||
- | job3 | ||
- | job4 | ||
- | # Lets tell slurmrunner.pl to execute jobs5-8 AFTER jobs1-4 have completed | ||
- | wait | ||
- | job5 | ||
- | job6 | ||
- | job7 | ||
- | job8 | ||
- | </ | ||
- | |||
- | Ahora se envia los comandos a slurm para que los ejecute en los nodos | ||
- | |||
- | <code bash> | ||
- | $ slurmrunner.pl --infile / | ||
- | </ | ||
- | |||
- | ==== Ejemplo de paralelizacion basica ==== | ||
- | Supongamos que tenemos un script que ejecuta secuencialmente 22 ordenes, cada una por cada cromosoma, | ||
- | |||
- | <code bash> | ||
- | for i in {1..22} | ||
- | do | ||
- | vcftools --gzvcf / | ||
- | plink --vcf HapMap.vcf.chr$i.recode.vcf --make-bed --out HapMap.chr$i | ||
- | rm HapMap.vcf.chr$i.recode.vcf | ||
- | done | ||
- | </ | ||
- | |||
- | Para ejecutar estas tareas en el cluster habria que hacer algo como, | ||
- | |||
- | <code bash> | ||
- | for i in {1..22} | ||
- | do | ||
- | echo " | ||
- | done > dale.in | ||
- | 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 | ||
- | rm / | ||
- | 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 ==== | ||
- | (// 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 | ||
- | <code bash> | ||
- | $ mkdir / | ||
- | $ cd / | ||
- | $ for x in {1..20}; do echo "`shuf -i1-100 -n1`" > file" | ||
- | </ | ||
- | |||
- | De forma que me quedan 20 archivos | ||
- | <code bash> | ||
- | $ $ ls -l | ||
- | total 10 | ||
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file10.txt | ||
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file11.txt | ||
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file12.txt | ||
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file13.txt | ||
- | -rw-rw---- 1 osotolongo osotolongo 3 Nov 17 18:32 file14.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. | ||
- | |||
- | <code bash> | ||
- | $ cat file* | ||
- | 50 | ||
- | 25 | ||
- | 37 | ||
- | 88 | ||
- | 51 | ||
- | 47 | ||
- | 70 | ||
- | 84 | ||
- | 16 | ||
- | 72 | ||
- | 45 | ||
- | 14 | ||
- | 18 | ||
- | 69 | ||
- | 29 | ||
- | 35 | ||
- | 8 | ||
- | 11 | ||
- | 50 | ||
- | 40 | ||
- | </ | ||
- | |||
- | Ahora lo que quiero es leer el contenido de cada archivo y crear un archivo que se llame numberXX.txt, | ||
- | |||
- | (// esto es una chorrada pero es ilustrativo //) | ||
- | |||
- | La solucion sequencial es trivial | ||
- | <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 | ||
- | |||
- | <code bash> | ||
- | $ for x in file*; do echo " | ||
- | </ | ||
- | |||
- | de manera que obtengamos estas ordenes, | ||
- | <code bash> | ||
- | $ cat dale.in | ||
- | y=$(cat file10.txt); | ||
- | y=$(cat file11.txt); | ||
- | y=$(cat file12.txt); | ||
- | y=$(cat file13.txt); | ||
- | y=$(cat file14.txt); | ||
- | y=$(cat file15.txt); | ||
- | y=$(cat file16.txt); | ||
- | y=$(cat file17.txt); | ||
- | y=$(cat file18.txt); | ||
- | y=$(cat file19.txt); | ||
- | y=$(cat file1.txt); echo file1.txt > number${y}.txt | ||
- | y=$(cat file20.txt); | ||
- | y=$(cat file2.txt); echo file2.txt > number${y}.txt | ||
- | y=$(cat file3.txt); echo file3.txt > number${y}.txt | ||
- | y=$(cat file4.txt); echo file4.txt > number${y}.txt | ||
- | y=$(cat file5.txt); echo file5.txt > number${y}.txt | ||
- | y=$(cat file6.txt); echo file6.txt > number${y}.txt | ||
- | y=$(cat file7.txt); echo file7.txt > number${y}.txt | ||
- | y=$(cat file8.txt); echo file8.txt > number${y}.txt | ||
- | y=$(cat file9.txt); echo file9.txt > number${y}.txt | ||
- | </ | ||
- | |||
- | Esto es precisamente lo que queremos, la variable //$x// se ha interpretado pero la variable //$y// no, esta la queremos averiguar en los nodos. Asi, la operacion de ordenar los archivos es secuencial, pero la operacion de hacer algo con esos archivos (que supuestamente es la que consume tiempo) la paralelizamos. | ||
- | |||
- | pues vamos a probar, | ||
- | |||
- | ** Primero exporto el // | ||
- | |||
- | <code bash> | ||
- | export PERL5LIB=$PERL5LIB:/ | ||
- | export PATH=$PATH:/ | ||
- | </ | ||
- | |||
- | y ahora lanzo los procesos | ||
- | |||
- | <code bash> | ||
- | $ slurmrunner.pl --infile dale.in --outdir test --jobname test | ||
- | Submitting job / | ||
- | With Slurm jobid 99 | ||
- | Submitting job / | ||
- | With Slurm jobid 100 | ||
- | Submitting job / | ||
- | With Slurm jobid 101 | ||
- | </ | ||
- | |||
- | 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> | ||
- | $ ls | ||
- | dale.in | ||
- | file10.txt | ||
- | file11.txt | ||
- | |||
- | $ cat number* | ||
- | 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 ==== | ||
- | |||
- | 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 // | ||
- | |||
- | 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 Mail:: | ||
- | |||
- | sub achtung { | ||
- | my @adv = @_; | ||
- | | ||
- | my $sender = new Mail:: | ||
- | from => " | ||
- | | ||
- | $sender-> | ||
- | subject => $adv[0], | ||
- | msg => $adv[1]}); | ||
- | } | ||
- | |||
- | my @jobs; my $msg; | ||
- | my @slurp = <>; | ||
- | foreach my $line (@slurp) { | ||
- | if((my $jobid) = $line =~ m/With Slurm jobid (\d+)/) { | ||
- | push @jobs, $jobid; | ||
- | } | ||
- | $msg.=$line; | ||
- | } | ||
- | |||
- | my $list_jobs = join(' \| ', @jobs); | ||
- | my $get_jobs = qx/squeue | grep " | ||
- | while($get_jobs){ | ||
- | $get_jobs = qx/squeue | grep " | ||
- | sleep 10; #Esto es para que chequee cada 10 segundos | ||
- | } | ||
- | |||
- | achtung "jobs done", $msg; | ||
- | </ | ||
- | |||
- | El script se usa añadiendolo tras la salida de // | ||
- | |||
- | <code bash> | ||
- | $ slurmrunner.pl --infile dale.in --outdir test --jobname test | / | ||
- | </ | ||
- | ==== Logs y troubleshooting ==== | ||
- | |||
- | Todos los archivos intermedios y los logs estan (segun hemos indicado con // | ||
- | |||
- | <code bash> | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | test/ | ||
- | 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> | ||
- | $ cat test/ | ||
- | y=$(cat file10.txt); | ||
- | y=$(cat file11.txt); | ||
- | y=$(cat file12.txt); | ||
- | y=$(cat file13.txt); | ||
- | y=$(cat file14.txt); | ||
- | y=$(cat file15.txt); | ||
- | y=$(cat file16.txt); | ||
- | y=$(cat file17.txt); | ||
- | </ | ||
- | |||
- | <code bash> | ||
- | $ cat test/ | ||
- | #!/bin/bash | ||
- | # | ||
- | #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 | ||
- | </ |