2014-12-30 25 views
11

Giả sử rằng tôi có kịch bản bash đơn giản sau đây mà tôi muốn gửi đến một máy chủ batch qua SLURM:đèo đối số dòng lệnh qua sbatch

#!/bin/bash 

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

hostname 

exit 0 

Trong kịch bản này, tôi chỉ đơn giản muốn viết đầu ra của hostname trên một textfile có tên đầy đủ để kiểm soát thông qua các dòng lệnh, như vậy:

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

Thật không may, có vẻ như dòng lệnh cuối cùng lập luận của tôi (1) không được phân tích cú pháp thông qua sbatch, kể từ khi các tập tin được tạo ra không có hậu tố mà tôi đang tìm kiếm và chuỗi "$ 1" là int erpreted nghĩa đen:

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

Tôi đã nhìn xung quanh nơi ở SOelsewhere, nhưng tôi đã không có bất kỳ may mắn. Về cơ bản những gì tôi đang tìm kiếm là tương đương với công tắc -v của tiện ích qsub trong các cụm hỗ trợ Torque.

Chỉnh sửa: Như đã đề cập trong chuỗi nhận xét cơ bản, tôi đã giải quyết vấn đề của mình một cách khó khăn: thay vì có một tập lệnh đơn lẻ sẽ được gửi nhiều lần đến máy chủ bó. một "tập lệnh chính" chỉ đơn giản là lặp lại và chuyển hướng cùng một nội dung lên các kịch bản lệnh khác nhau, nội dung của từng được thay đổi bởi tham số dòng lệnh được truyền. Sau đó, tôi đã gửi tất cả những người đó đến máy chủ theo lô của mình thông qua sbatch. Tuy nhiên, điều này không trả lời câu hỏi ban đầu, vì vậy tôi ngần ngại thêm nó như là một câu trả lời cho câu hỏi của tôi hoặc đánh dấu câu hỏi này được giải quyết.

+0

Tôi không biết SLURM. Bạn có thể đơn giản hóa tập lệnh thành các dòng 'touch outfile $ {1} .txt', vì vậy chúng tôi có thể cố gắng tạo lại lỗi và sửa lỗi không? –

+0

Số 1 được chuyển đến tập lệnh nhưng không được xem xét cho tên của tệp khi slurm tiền xử lý tệp để nhận cờ, nhưng biến sẽ có sẵn bên trong tập lệnh. Làm thế nào để bạn làm điều đó trên Torque? –

+0

@WalterA: Giải pháp của bạn hoạt động trong trường hợp 'touch', có nghĩa là, đối số mà tôi chuyển qua' sbatch' được đọc bởi kịch bản là '$ 1'. Tuy nhiên, có vẻ như '$ 1' được phân tích theo nghĩa đen bởi' sbatch' trong trường hợp '-o' và' -e', sao cho tôi kết thúc với các tệp như 'outFile $ {1} .txt'on disk. @CarlesFenoy: Tôi tin rằng bạn đúng trong những gì bạn đang nói trong đó SLURM xử lý trước tệp để nhận các cờ '-o' và' -e' (xem phản hồi của tôi với @WalterA ở trên). Trong Torque, bạn có thể làm một cái gì đó như 'qsub -D 'pwd' -v var = 1 script.sh' và' $ var' sẽ có giá trị là 1 trong 'script.sh'. – Jason

Trả lời

1

Các dòng bắt đầu bằng #SBATCH không được giải thích bằng bash nhưng được thay thế bằng mã bằng sbatch. Tùy chọn sbatch không hỗ trợ $ 1 vars (chỉ% j và một số khác, thay thế $ 1 bởi% 1 sẽ không hoạt động). Khi bạn không có các quy trình sbatch khác nhau chạy song song, bạn có thể thử

#!/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 

Alternative: Như bạn nói trong một bình luận chính mình, bạn có thể làm cho một masterscript. Kịch bản này có thể chứa các dòng như

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 

Trong mẫu của mình theo dòng #SBATCH trông giống như

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

Cảm ơn bạn! Về cơ bản, giải pháp này cho phép mã của sbatch hoạt động trên các liên kết mềm, nhưng các liên kết tự trỏ đến các tệp thực được tạo bởi phần của kịch bản lệnh có thể phân tích cú pháp các đối số dòng lệnh một cách chính xác. Tôi sẽ chấp nhận điều này như câu trả lời của tôi. – Jason

+0

Điều này sẽ không hoạt động khi các tham số #SBATCH phải xuất hiện [trước khi bất kỳ lệnh nào khác mà chúng bị bỏ qua] (http://slurm.schedmd.com/sbatch.html) – damienfrancois

+0

@damienfrancois Bạn có thể đúng, tôi chưa thực sự thử nó với Slurm. Tôi nhìn vào liên kết của bạn, và tôi nghĩ rằng kịch bản của tôi nên được chia thành một phần được sử dụng bởi Slurm (chỉ với #SBATCH dòng) và một bản chính sẽ gọi Slurm. Bản ghi chép đó nên tự tách rời khỏi con mình và không biết khi nào cần dọn dẹp các liên kết tạm thời. Vì vậy, tôi đoán giải pháp thay thế (với một mẫu) tôi đã làm việc tốt hơn. Bạn có biết nếu bạn có thể đặt các biến Shell trong một ''? Một cái gì đó như '--output = File $ {some_var} .out' hoặc' --output = File $ {myshell.sh} .out'? –

6

tôi nghĩ rằng tôi muốn cung cấp một số cái nhìn sâu sắc vì tôi cũng đang tìm kiếm sự thay thế để lựa chọn -v trong qsub, cho sbatch có thể được thực hiện bằng cách sử dụng tùy chọn --export. Tôi đã tìm thấy một số nice site here hiển thị danh sách các chuyển đổi từ Torque đến Slurm và việc chuyển đổi nhiều hơn mượt mà hơn. Tôi chưa xác minh rằng điều này cụ thể hoạt động được nêu ra, nhưng tôi sẽ cập nhật câu trả lời cho phù hợp nếu nó cần phải được thay đổi.

Bạn có thể chỉ định các biến môi trường trước thời hạn trong kịch bản bash của bạn:

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

Hoặc định nghĩa nó trực tiếp trong lệnh sbatch giống như qsub phép:

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

Cho dù điều này làm việc trong # bộ tiền xử lý của exampleJob.sh cũng là một câu hỏi khác, nhưng tôi giả định rằng nó sẽ cung cấp cho cùng một chức năng tìm thấy trong mô-men xoắn.

1

Something như thế này làm việc cho tôi và Torque

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

Nếu bạn vượt qua các lệnh của bạn thông qua dòng lệnh, bạn thực sự có thể bỏ qua các vấn đề không thể vượt qua đối số dòng lệnh trong tập lệnh batch. Ví dụ: tại dòng lệnh:

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

Sử dụng trình bao bọc thuận tiện hơn. Tôi đã tìm thấy giải pháp này từ this thread.

Về cơ bản vấn đề là các chỉ thị SBATCH được xem là chú thích của trình bao và do đó bạn không thể sử dụng các đối số được truyền trong chúng. Thay vào đó, bạn có thể sử dụng tài liệu ở đây để nạp vào tập lệnh bash của bạn sau khi các đối số được đặt tương ứng.

Trong trường hợp của câu hỏi của bạn, bạn có thể thay thế các tập tin shell script với điều này:

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

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

hostname 

exit 0 
EOT 

Và bạn chạy shell script như thế này:

bash [script_name].sh [suffix] 

Và kết quả đầu ra sẽ được lưu vào outfile [hậu tố] .txt và errFile [hậu tố] .txt

Các vấn đề liên quan