Scripting

Converting code into a script is useful, and almost necessary when running jobs on the cluster.

There are many benifits of doing this:

  • Easy to run - blackbox
  • Easy to maintain - consolidated code
  • Easy to distribute - capsulated code
  • Easy to automate (crontab?) - does not require interaction

Breakdown

There are four basic parts that are needed to convert your commands into a script:

  1. First save all your commands into a file and call it myscript.sh, you can do this with a Text Editor or Transferring it from your computer.

  2. Add the #! (SheBang) as the first line in file, this defines the interpreter. In this example, we are using bash as the interpreter, which will run all subsequent lines in this file:

#!/bin/bash
  1. Add the proper permissions to the script, allow user (or group) execution:
chmod u+x myscript.sh

OR

chmod g+x myscript.sh
  1. You can pass arguments via command line into a script, this step is optional, but important to note.

For example if I want to call my script, like so:

/where/my/script/lives/myscript.sh username number

Then inside my script I can capture the command line arguments into variables, like this:

username=$1
number=$2
  1. Lastly adding the path to a script to the PATH environment variable, allows us to call the script without a prefixed path:
export PATH=/where/my/script/lives/:$PATH     # Can be added to .bashrc for convenience

After we have exported PATH with the new path of our script, we call it like so:

myscript.sh username number

Walkthrough

My bash commands:

sacct -n -p -u jhayes -S 2020-01-01 -l > myjobs.txt
cut -d'|' -f4 myjobs.txt > partitions.txt
wc -l partitions.txt > count.txt

Convert the above commands into a script named myscript.sh, with the following contents:

#!/bin/bash

# Gather Slurm job information
sacct -n -p -u jhayes -S 2020-01-01 -l > myjobs.txt

# Filter on parittion column
cut -d'|' -f4 myjobs.txt > partitions.txt

# Count how many records per partition
cat partitions.txt | sort | uniq -c > count.txt

Optional, we can alter the above commands by adding some pipes, as well as adding some variables to make this script count records for only a given partition:

#!/bin/bash -l

# Gather Slurm job information
#  filter on partition column
#  count how many records for given partition
sacct -n -p -u $1 -S 2020-01-01 -l | cut -d'|' -f4 | grep $2 | wc -l > count.txt

Add correct permissions:

chmod u+x myscript.sh

Add to my PATH:

mkdir -p ~/bin
mv myscript.sh ~/bin
export PATH=~/bin:$PATH

Now run my new script:

myscript.sh

Or, if we did the optional step of adding variables, we can do this:

myscript.sh johndoe001 intel         # Arguments are <USERNAME> and <PARTITION>