2014-12-30 14 views
11

Załóżmy, że mam następujący prosty skrypt bash, które chcesz przesłać do serwera wsadowym przez slurm:przekazywać argumenty linii poleceń poprzez sbatch

#!/bin/bash 

#SBATCH -o "outFile"$1".txt" 
#SBATCH -e "errFile"$1".txt" 

hostname 

exit 0 

W tym scenariuszu, ja po prostu chcę pisać wyjście hostname na pliku tekstowego, którego pełna nazwa kontrolować za pomocą wiersza poleceń, tak jak poniżej:

login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1 
Submitted batch job 203775 

Niestety, wydaje się, że mój ostatni argument wiersza polecenia (1) nie jest analizowany przez sbatch, ponieważ pliki utworzone nie Mam sufiks, którego szukam, a ciąg "$ 1" jest int erpreted dosłownie:

login-2:jobs$ ls 
errFile$1.txt exampleJob.sh outFile$1.txt 

szukałem wokół miejsc w SO i elsewhere, ale nie miałem szczęścia. Zasadniczo to, czego szukam, jest odpowiednikiem przełącznika -v narzędzia qsub w klastrach z obsługą Torque.

Edit: Jak wspomniano w podstawowej komentarz wątku, I rozwiązać mój problem w przykry sposób: zamiast tylko jednego skryptu, który zostanie poddany kilkakrotnie do serwera wsadowego, każda z różnych argumentów wiersza poleceń, stworzyłem "skrypt główny", który po prostu powtórzył i przekierował tę samą treść do różnych skryptów, treść każdej z nich została zmieniona przez przekazany parametr wiersza poleceń. Następnie przesłałem wszystkie te dane do mojego serwera wsadowego za pośrednictwem sbatch. Nie odpowiada to jednak na oryginalne pytanie, dlatego woleję dodać je jako odpowiedź na moje pytanie lub oznaczyć to pytanie.

+0

Nie znam SLURM. Czy możesz uprościć skrypt do linii 'touch outfile $ {1} .txt', abyśmy mogli spróbować odtworzyć błąd i go naprawić? –

+0

1 jest przekazywany do skryptu, ale nie jest brany pod uwagę dla nazw plików, ponieważ slurm wstępnie przetwarza plik, aby uzyskać flagi, ale zmienna powinna być dostępna wewnątrz skryptu. Jak to zrobić w Torque? –

+0

@WalterA: Twoje rozwiązanie działało w przypadku 'touch', to znaczy argument, który przechodzę przez' sbatch'jest poprawnie odczytywany przez skrypt jako '$ 1'. Jednak wydaje się, że '$ 1' jest przetwarzany dosłownie przez' sbatch' w przypadku '-o' i' -e', tak że kończę z plikami takimi jak 'outFile $ {1} .txt' na dysku. @CarlesFenoy: Wierzę, że masz rację w tym, co mówisz, że SLURM wstępnie przetwarza plik, aby uzyskać flagi '-o' i' -e' (patrz także moja odpowiedź na @WalterA powyżej). W Torque możesz zrobić coś takiego jak 'qsub -D 'pwd' -v var = 1 script.sh' i' $ var' ma wartość 1 w 'script.sh'. – Jason

Odpowiedz

1

Linie rozpoczynające się od #SBATCH nie są interpretowane przez bash, ale zastępowane są przez kod za pomocą polecenia sbatch. Opcje sbatch nie obsługują vars 1 $ (tylko% j i niektóre inne, zastępując 1 $ przez% 1 nie będą działać). Kiedy nie masz różne procesy sbatch uruchomione równolegle, można spróbować

#!/bin/bash 

touch outFile${1}.txt errFile${1}.txt 
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs 
ln -s outFile${1}.txt link_out.sbatch 
ln -s errFile${1}.txt link_err.sbatch 

#SBATCH -o link_out.sbatch 
#SBATCH -e link_err.sbatch 

hostname 
# I do not know about the background processing of sbatch, are the jobs still running 
# at this point? When they are, you can not delete the temporary symlinks yet. 

exit 0 

Alternatywnie: Jak powiedział w komentarzu siebie, można zrobić masterscript. Ten skrypt może zawierać linie takie jak

cat exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh 
# I do not know, is the following needed with sbatch? 
chmod +x exampleJob.sh 

W szablonie linie #SBATCH wyglądać

#SBATCH -o "outFile.txt" 
#SBATCH -e "errFile.txt" 
+0

Dziękujemy! Zasadniczo to rozwiązanie pozwala kodowi sbatch operować na miękkich łączach, ale same łącza wskazują na rzeczywiste pliki utworzone przez część skryptu powłoki, która może poprawnie analizować argumenty wiersza poleceń. Przyjmę to jako moją odpowiedź. – Jason

+0

To nie zadziała, ponieważ parametry #SBATCH muszą pojawić się [przed jakimkolwiek innym poleceniem, w przeciwnym razie zostaną zignorowane] (http://slurm.schedmd.com/sbatch.html) – damienfrancois

+0

@damienfrancois Możesz mieć rację, właściwie tego nie próbowałem z Slurm. Spojrzałem na twój link i myślę, że mój skrypt powinien zostać podzielony na część używaną przez Slurm (tylko z liniami #SBATCH) i skryptem, który będzie wywoływał Slurm. Ten kapitan powinien odłączyć się od swojego dziecka i nie wie, kiedy oczyścić tymczasowe linki. Więc domyślam się, że alternatywne rozwiązanie (z szablonem) dałem działa lepiej. Czy wiesz, czy możesz umieścić zmienne powłoki w '"? Coś w rodzaju '--output = plik $ {some_var} .out' lub' --output = plik $ {myshell.sh} .out'? –

6

pomyślałem, że oferują pewien wgląd bo też patrząc na wymianę do opcji -v w qsub, która dla sbatch może być wykonana przy użyciu opcji --export. Znalazłem numer nice site here, który pokazuje listę konwersji z Torque do Slurm i sprawił, że przejście stało się bardziej płynne. Nie sprawdziłem, czy to działa, ale zaktualizuję odpowiedź, jeśli będzie to wymagało zmiany.

Można określić zmienną środowiskową z wyprzedzeniem w skrypcie bash:

$ var_name='1' 
$ sbatch -D `pwd` exampleJob.sh --export=var_name 

lub zdefiniować ją bezpośrednio w komendzie w sbatch jak qsub dozwolone: ​​

$ sbatch -D `pwd` exampleJob.sh --export=var_name='1' 

czy to działa w # preprocesory z exampleJob.sh to kolejne pytanie, ale zakładam, że powinien dać taką samą funkcjonalność, jaką można znaleźć w Torque.

1

Coś jak to działa na mnie i moment

echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST 
slurm.qsub: 

#!/bin/bash 
hostname > outFile${1}.txt 2>errFile${1}.txt 
exit 0 
8

Jeśli przekazać swoje polecenia za pomocą wiersza poleceń, rzeczywiście można ominąć ten problem nie jest w stanie przekazać argumenty wiersza polecenia w skrypcie. Na przykład w wierszu poleceń:

var1="my_error_file.txt" 
var2="my_output_file.txt" 
sbatch --error=$var1 --output=$var2 batch_script.sh 
1

Korzystanie z obwoluty jest wygodniejsze. Znalazłem to rozwiązanie od this thread.

Zasadniczo problem polega na tym, że dyrektywy SBATCH są postrzegane jako komentarze przez powłokę i dlatego nie można używać w nich przekazywanych argumentów. Zamiast tego możesz użyć tutaj dokumentu, aby podać swój skrypt bash po odpowiednim ustawieniu argumentów.

W przypadku Twojego pytania można zastąpić plik skryptu powłoki z tym:

#!/bin/bash 
sbatch <<EOT 
#!/bin/bash 

#SBATCH -o "outFile"$1".txt" 
#SBATCH -e "errFile"$1".txt" 

hostname 

exit 0 
EOT 

I uruchomić skrypt tak:

bash [script_name].sh [suffix] 

a wyjścia zostaną zapisane plik_wy [przyrostek] .txt i errFile [przyrostek] .txt

Powiązane problemy