# Simple load testing script in bash

Here's the code

max="$1" date echo "url:$2
rate: $max calls / second" START=$(date +%s);

get () {
curl -s -v "$1" 2>&1 | tr '\r\n' '\\n' | awk -v date="$(date +'%r')" '{print $0"\n-----", date}' >> /tmp/perf-test.log } while true do echo$(($(date +%s) - START)) | awk '{print int($1/60)":"int($1%60)}' sleep 1 for i in seq 1$max
do
get $2 & done done This can be run as sh load-test.sh 20 "http://api.myserver.com/get_info" Please suggest if you think there's a way to take in multiple curl options. ## 1 Answer ### Arithmetics in Bash You're doing some math in Bash, some in Awk, some in a combination of both. You can do all of that in Bash alone. Most notably, instead of this: echo$(($(date +%s) - START)) | awk '{print int($1/60)":"int($1%60)}' This would be equivalent, but all in Bash, without additional processes: ((delta =$(date +%s) - START))
((minutes = delta / 60))
((seconds = delta % 60))
echo $minutes:$seconds

### Don't use seq

seq is not portable, I suggest to avoid it. Instead of this:

### Other minor things

This would be clearer as two echo lines, or a here-document with cat <<EOF:

echo "url: $2 rate:$max calls / second"

The trailing semicolon is unnecessary:

START=\$(date +%s);

The quoting is unnecessary in date +'%r', but it does no harm.

• seq is very common in Linux these days. – chicks Mar 4 '16 at 15:40
• I prefer my scripts to run everywhere – janos Mar 4 '16 at 16:05
• Every comment you made is valid, I over-looked them. Any word on the loooong curl command. It itches me but i couldn't do much. – bigOmega Mar 6 '16 at 19:36
• @bigΩmega well, I'm wondering if you need the tr at all. I think you can simply drop that from the pipeline but I'm not sure. You can give that a try. – janos Mar 6 '16 at 20:05
• @janos So without that tr i only get the first line out of the pipe – bigOmega Mar 7 '16 at 6:31