Pass command line arguments via sbatch

后端 未结 6 1117
我寻月下人不归
我寻月下人不归 2021-01-31 02:44

Suppose that I have the following simple bash script which I want to submit to a batch server through SLURM:

#!/bin/bash

#SBATCH -o \"outFile\"$1\".txt\"
#SBATC         


        
相关标签:
6条回答
  • 2021-01-31 03:09

    Using a wrapper is more convenient. I found this solution from this thread.

    Basically the problem is that the SBATCH directives are seen as comments by the shell and therefore you can't use the passed arguments in them. Instead you can use a here document to feed in your bash script after the arguments are set accordingly.

    In case of your question you can substitute the shell script file with this:

    #!/bin/bash
    sbatch <<EOT
    #!/bin/bash
    
    #SBATCH -o "outFile"$1".txt"
    #SBATCH -e "errFile"$1".txt"
    
    hostname
    
    exit 0
    EOT
    

    And you run the shell script like this:

    bash [script_name].sh [suffix]
    

    And the outputs will be saved to outFile[suffix].txt and errFile[suffix].txt

    0 讨论(0)
  • 2021-01-31 03:11

    I thought I'd offer some insight because I was also looking for the replacement to the -v option in qsub, which for sbatch can be accomplished using the --export option. I found a nice site here that shows a list of conversions from Torque to Slurm, and it made the transition much smoother.

    You can specify the environment variable ahead of time in your bash script:

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

    Or define it directly within the sbatch command just like qsub allowed:

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

    Whether this works in the # preprocessors of exampleJob.sh is also another question, but I assume that it should give the same functionality found in Torque.

    0 讨论(0)
  • 2021-01-31 03:16

    If you pass your commands via the command line, you can actually bypass the issue of not being able to pass command line arguments in the batch script. So for instance, at the command line :

    var1="my_error_file.txt"
    var2="my_output_file.txt"
    sbatch --error=$var1 --output=$var2 batch_script.sh
    
    0 讨论(0)
  • 2021-01-31 03:18

    Something like this works for me and 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
    
    0 讨论(0)
  • 2021-01-31 03:28

    This is an old question but I just stumbled into the same task and I think this solution is simpler:

    Let's say I have the variable $OUT_PATH in the bash script launch_analysis.bash and I want to pass this variable to task_0_generate_features.sl which is my SLURM file to send the computation to a batch server. I would have the following in launch_analysis.bash:

    `sbatch --export=OUT_PATH=$OUT_PATH task_0_generate_features.sl`
    

    Which is directly accessible in task_0_generate_features.sl

    In @Jason case we would have:

    sbatch -D `pwd` --export=hostname=$hostname exampleJob.sh
    

    Reference: Using Variables in SLURM Jobs

    0 讨论(0)
  • 2021-01-31 03:33

    The lines starting with #SBATCH are not interpreted by bash but are replaced with code by sbatch. The sbatch options do not support $1 vars (only %j and some others, replacing $1 by %1 will not work). When you don't have different sbatch processes running in parallel, you could try

    #!/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: As you said in a comment yourself, you could make a masterscript. This script can contain lines like

    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
    

    In your template the #SBATCH lines look like

    #SBATCH -o "outFile.txt"
    #SBATCH -e "errFile.txt"
    
    0 讨论(0)
提交回复
热议问题