2012-04-10 16 views
9

Esiste un modo per passare direttamente i parametri a uno script .pbs prima di inviare un lavoro? Ho bisogno di scorrere un elenco di file indicati da numeri diversi e applicare uno script per analizzare ogni file.Passa direttamente i parametri allo script pbs

Il meglio che ho potuto venire con è la seguente:

#!/bin/sh 

for ((i= 1; i<= 10; i++)) 
do 
     export FILENUM=$i 
     qsub pass_test.pbs 
done 

dove pass_test.pbs è il seguente script:

#!/bin/sh 

#PBS -V 
#PBS -S /bin/sh 
#PBS -N pass_test 
#PBS -l nodes=1:ppn=1,walltime=00:02:00 
#PBS -M [email protected] 

cd /scratch/XXXXXX/pass_test 

./run_test $FILENUM 

Ma questo si sente un po 'traballante. In particolare, voglio evitare di dover creare una variabile d'ambiente per gestirlo.

risposta

8

L'utilità qsub in grado di leggere la sceneggiatura dallo standard input, in modo da utilizzare un here document è possibile creare script al volo, dinamicamente:

#!/bin/sh 

for i in `seq 1 10` 
do 
    cat <<EOS | qsub - 
#!/bin/sh 

#PBS -V 
#PBS -S /bin/sh 
#PBS -N pass_test 
#PBS -l nodes=1:ppn=1,walltime=00:02:00 
#PBS -M [email protected] 

cd /scratch/XXXXXX/pass_test 

./run_test $i 
EOS 
done 

Personalmente, vorrei utilizzare una versione più compatta :

#!/bin/sh 

for i in `seq 1 10` 
do 
    cat <<EOS | qsub -V -S /bin/sh -N pass_test -l nodes=1:ppn=1,walltime=00:02:00 -M [email protected] - 
cd /scratch/XXXXXX/pass_test 
./run_test $i 
EOS 
done 
0

Se avete solo bisogno di passare i numeri ed eseguire un elenco di posti di lavoro con lo stesso comando, tranne il numero di file di input, è meglio utilizzare un array di lavoro, invece di un ciclo for come array di lavoro avrebbe meno onere per lo scheduler.

Per eseguire, si specifica il numero di file con PBS_ARRAYID come questo nel file PBS:

./run_test ${PBS_ARRAYID} 

E per invocarlo, sulla linea di comando, digitare:

qsub -t 1-10 pass_test.pbs 

cui è possibile specificare quale ID dell'array utilizzare dopo l'opzione -t

Problemi correlati