How to Write a shell alias or function for quick login to a node managed by SLURM

For tasks better run in a dedicated but interactive fashion, it might be advantageous to save the repeating pattern of reserving resources and starting a new associated shell in an alias or function, as explained below.

If you use bash as default shell you can place the following alias definition in your ~/.bashrc file and source this file in the ~/.bash_profile or in the ~/.profile file:

alias ssh2node='salloc -n 1 -p prepost -- /bin/bash -c "ssh -tt -X \$SLURM_JOB_NODELIST"'

If you use tcsh as default shell you can put the following line in your ~/.cshrc file to define the alias ssh2node:

alias ssh2node 'salloc -n 1 -p prepost -- /bin/tcsh -c '\''ssh -X $SLURM_JOB_NODELIST'\'''

Thereafter, the command ssh2node can be used to allocate computing resources and log into the allotted node in one step:

$ ssh2node
salloc: Pending job allocation 292893
salloc: job 292893 queued and waiting for resources
salloc: job 292893 has been allocated resources
salloc: Granted job allocation 292893
Warning: Permanently added 'm11515,10.50.9.252' (RSA) to the list of known hosts.
user@m11515:~>

An even more flexible solution is to define a shell function that combines ‘salloc’ and ‘ssh’ and accepts options to specify those requirements likely to change (e.g. number of tasks, partition, project account).

The example below defines a bash function s2n that can be added to your ~/.bashrc file:

s2n(){
    # set default values for number of tasks, partition, and account
    ntasks=1
    partition=prepost
    account=$SLURM_ACCOUNT
    OPTIND=1
    # parse options with arguments
    while getopts :n:p:a: opt; do
        case ${opt} in
            n ) ntasks=$OPTARG
                ;;
            p ) partition=$OPTARG
                ;;
            a ) account=$OPTARG
                ;;
           \? ) echo "Invalid option: $OPTARG" 1>&2
                return
                ;;
            : ) echo "Invalid option: $OPTARG requires an argument" 1>&2
                return
                ;;
        esac
    done
    # allocate ressources and log into the allotted node
    salloc -A ${account} -n ${ntasks} -p ${partition} -- /bin/bash -c "ssh -tt -X \$SLURM_JOB_NODELIST"
}

and used to start interactive sessions according to different needs, for example:

# ask for 4 CPUs on one node in the partition prepost using default account
$ s2n -n 4 -p prepost

# use account xz0456 instead of default account
$ s2n -a xz0456

# ask for 48 CPUs on one node in the partition gpu
$ s2n -n 48 -p gpu

Tcsh or csh do not allow for shell functions. This deficiency can be partly compensated for by defining an alias with positional parameters as shown in the example below:

alias s2n 'salloc -n \!:1 -p \!:2 -A \!:3 -- /bin/tcsh -c '\''ssh -X $SLURM_JOB_NODELIST'\'''

However, for tcsh/csh, all parameters MUST be specified and the order of parameters (in the example above number of tasks, partition, account) DOES matter:

# ask for 4 CPUs on on node in the partition prepost using default account
$ s2n 4 prepost xz0123

# use account xz0456 instead of default account
$ s2n 1 prepost xz0456

# ask for 48 CPUs on one node in the partition gpu
$ s2n 48 gpu xz0123

Another possibility (not shown here) is to write a Unix utility using a language of your choice (python, perl etc.), place it in your ~/bin directory and add this directory to your PATH.