Update: There is considerably more efficient method of running HammerDB through a bash script described in a more recent post here: Running hammerdbcli from a bash or batch script updated for v3.2 It is strongly recommended to move to this method described for v3.2 rather than the method described in this post which can have a greater overhead and a potential impact on performance imposed by bash.
A current FAQ is how to drive the command line hammerdbcli from an external bash script. This post gives an example of one way which this can be done.
For an example we will run a bash script that prints output and then runs hammerdbcli to build an Oracle schema before wating for this to finish and printing more output. Firstly we need the hammerdbcli script. Note that as HammerDB is multithreaded, adding exit to the end of a script will cause that script to terminate before virtual users are complete. This is unlikely to be the desired outcome. Therefore you need a function that will wait for the script to complete before issuing the exit. The important command here is vucomplete and you need to wait until the condition of this is “true”. An example of this is as follows:
#!/bin/tclsh puts "SETTING CONFIGURATION" global complete proc wait_to_complete {} { global complete set complete [vucomplete] if {!$complete} {after 5000 wait_to_complete} else { exit } } dbset db ora diset connection system_password oracle diset connection instance vulpdb1 diset tpcc count_ware 4 diset tpcc num_vu 4 diset tpcc tpcc_def_tab users print dict buildschema wait_to_complete
This script has been saved as buildora.tcl. Now we want the driving bash script that looks as follows:
#!/bin/bash echo "BASH SCRIPT BEFORE BUILD.." ./hammerdbcli <<! source buildora.tcl ! echo "BASH SCRIPT AFTER BUILD.."
if you want to redirect your output to a file it can look like the following:
#!/bin/bash echo "BASH SCRIPT BEFORE BUILD.." ./hammerdbcli <<!>> buildora.output 2>&1 source buildora.tcl ! echo "BASH SCRIPT AFTER BUILD.."
If you run the bash script it will now call hammerdbcli that will run buildora.tcl, this will wait until complete to call exit before returning control back to the bash script. This is just one example of many ways in which hammerdbcli can be blended with Tcl, bash or even Python to automate HammerDB functionality.
If it is needed to strip the control characters from the output this can be done using sed. The stdbuf command can also be used to write the output line by line to the output file.
#!/bin/bash echo "BASH SCRIPT BEFORE BUILD.." ./hammerdbcli <<! 2>&1 | stdbuf -oL -eL sed -e "s,\x1B\[[0-9;]*[a-zA-Z],,g" -e "s,\r,,g" -e "s,hammerdb>,,g" -e "s,after\#[0-9]*,,g" >> buildora.output source buildora.tcl ! echo "BASH SCRIPT AFTER BUILD.."
You can also invoke the TCL script directly:
tclsh86t buildora.tcl
If you add the correct variables to the PATH.