diff --git a/bin/pt-stalk b/bin/pt-stalk index cb6d872c..3e70c8a0 100755 --- a/bin/pt-stalk +++ b/bin/pt-stalk @@ -464,11 +464,29 @@ rm_tmpdir() { set -u +CMD_PIDOF="$(which pidof)" +CMD_PGREP="$(which pgrep)" + _seq() { local i="$1" awk "BEGIN { for(i=1; i<=$i; i++) print i; }" } +_pidof() { + local proc="$1" # process name + local pat="${2:-""}" # pattern in case we must grep for proc + + local pid="" + + [ "$CMD_PIDOF" ] && pid=$(pidof -s "$proc"); + + [ -z "$pid" ] && [ "$CMD_PGREP" ] && pid=$(pgrep -o -x "$proc"); + + [ -z "$pid" ] && pid=$(ps -eaf | grep "$pat" | grep -v mysqld_safe | awk '{print $2}' | head -n1) + + echo $pid +} + # ########################################################################### # End alt_cmds package # ########################################################################### @@ -592,6 +610,7 @@ set -u CMD_GDB="$(which gdb)" CMD_IOSTAT="$(which iostat)" +CMD_LSOF="$(which lsof)" CMD_MPSTAT="$(which mpstat)" CMD_MYSQL="$(which mysql)" CMD_MYSQLADMIN="$(which mysqladmin)" @@ -599,20 +618,17 @@ CMD_OPCONTROL="$(which opcontrol)" CMD_OPREPORT="$(which opreport)" CMD_PMAP="$(which pmap)" CMD_STRACE="$(which strace)" +CMD_SYSCTL="$(which sysctl)" CMD_TCPDUMP="$(which tcpdump)" CMD_VMSTAT="$(which vmstat)" +[ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl" + collect() { local d="$1" # directory to save results in local p="$2" # prefix for each result file - local mysqld_pid=$(pidof -s mysqld); - if [ -z "$mysqld_pid" ]; then - mysqld_pid=$(pgrep -o -x mysqld); - fi - if [ -z "$mysqld_pid" ]; then - mysqld_pid=$(ps -eaf | grep 'mysql[d]' | grep -v mysqld_safe | awk '{print $2}' | head -n1); - fi + local mysqld_pid=$(_pidof mysqld mysql[d]); if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then if $CMD_PMAP --help 2>&1 | grep -- -x >/dev/null 2>&1 ; then @@ -630,7 +646,7 @@ collect() { >> "$d/$p-stacktrace" fi - $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" & sleep .2 local mysql_version="$(awk '/^version[^_]/{print substr($2,1,3)}' "$d/$p-variables")" @@ -643,11 +659,12 @@ collect() { local tail_error_log_pid="" if [ "$mysql_error_log" ]; then echo "The MySQL error log seems to be ${mysql_error_log}" - tail -f "$mysql_error_log" >"$d/$p-log_error" 2>&1 & + tail -f "$mysql_error_log" >"$d/$p-log_error" & tail_error_log_pid=$! + $CMD_MYSQLADMIN $EXT_ARGV debug else - echo "Could not find the MySQL error log" + echo "Could not find the MySQL error log" >&2 fi local innostat="SHOW /*!40100 ENGINE*/ INNODB STATUS\G" @@ -656,9 +673,9 @@ collect() { else local mutex="SHOW MUTEX STATUS" fi - $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" 2>&1 & - $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" 2>&1 & - open_tables >> "$d/$p-opentables1" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" & + $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" & + open_tables >> "$d/$p-opentables1" & local tcpdump_pid="" if [ "$CMD_TCPDUMP" -a "$OPT_COLLECT_TCPDUMP" ]; then @@ -676,28 +693,33 @@ collect() { have_oprofile="yes" fi elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then - $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" 2>&1 & + $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" & local strace_pid=$! fi - ps -eaf >> "$d/$p-ps" 2>&1 & - sysctl -a >> "$d/$p-sysctl" 2>&1 & - top -bn1 >> "$d/$p-top" 2>&1 & - lsof -nP -p $mysqld_pid -bw >> "$d/$p-lsof" 2>&1 & + ps -eaf >> "$d/$p-ps" & + top -bn1 >> "$d/$p-top" & + + if [ "$CMD_LSOF" ]; then + $CMD_LSOF -nP -p $mysqld_pid -bw >> "$d/$p-lsof" & + fi + if [ "$CMD_SYSCTL" ]; then + $CMD_SYSCTL -a >> "$d/$p-sysctl" & + fi if [ "$CMD_VMSTAT" ]; then - $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" 2>&1 & - $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" 2>&1 & + $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" & + $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" & fi if [ "$CMD_IOSTAT" ]; then - $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" 2>&1 & - $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" 2>&1 & + $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" & + $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" & fi if [ "$CMD_MPSTAT" ]; then - $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" 2>&1 & - $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" 2>&1 & + $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" & + $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" & fi - $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" 2>&1 & + $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" & local mysqladmin_pid=$! local have_lock_waits_table=0 @@ -719,35 +741,38 @@ collect() { sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}') local ts="$(date +"TS %s.%N %F %T")" + if [ -d "/proc" ]; then if [ -f "/proc/diskstats" ]; then - (cat /proc/diskstats 2>&1; echo $ts) >> "$d/$p-diskstats" & + (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & fi if [ -f "/proc/stat" ]; then - (cat /proc/stat 2>&1; echo $ts) >> "$d/$p-procstat" & + (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & fi if [ -f "/proc/vmstat" ]; then - (cat /proc/vmstat 2>&1; echo $ts) >> "$d/$p-procvmstat" & + (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & fi if [ -f "/proc/meminfo" ]; then - (cat /proc/meminfo 2>&1; echo $ts) >> "$d/$p-meminfo" & + (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & fi if [ -f "/proc/slabinfo" ]; then - (cat /proc/slabinfo 2>&1; echo $ts) >> "$d/$p-slabinfo" & + (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & fi if [ -f "/proc/interrupts" ]; then - (cat /proc/interrupts 2>&1; echo $ts) >> "$d/$p-interrupts" & + (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & fi fi - (df -h 2>&1; echo $ts) >> "$d/$p-df" & - (netstat -antp 2>&1; echo $ts) >> "$d/$p-netstat" & - (netstat -s 2>&1; echo $ts) >> "$d/$p-netstat_s" & - ($CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \ - >> "$d/$p-processlist" + (echo $ts; df -h) >> "$d/$p-df" & + + (echo $ts; netstat -antp) >> "$d/$p-netstat" & + (echo $ts; netstat -s) >> "$d/$p-netstat_s" & + + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ + >> "$d/$p-processlist" & if [ $have_lock_waits_table -eq 1 ]; then - (lock_waits 2>&1; echo $ts) >>"$d/$p-lock-waits" + (echo $ts; lock_waits) >>"$d/$p-lock-waits" & fi done echo "Loop end: $(date +'TS %s.%N %F %T')" @@ -781,21 +806,28 @@ collect() { kill -s 18 $mysqld_pid fi - $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" 2>&1 & - $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" 2>&1 & - open_tables >> "$d/$p-opentables2" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" & + $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" & + open_tables >> "$d/$p-opentables2" & kill $mysqladmin_pid [ "$tail_error_log_pid" ] && kill $tail_error_log_pid - [ "$tcpdump_pid" ] && kill $tcpdump_pid + [ "$tcpdump_pid" ] && kill $tcpdump_pid hostname > "$d/$p-hostname" + + for file in "$d/$p-"*; do + if [ -z "$(grep -v '^TS ' --max-count 1 "$file")" ]; then + log "Removing empty file $file"; + rm "$file" + fi + done } open_tables() { local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}') if [ -n "$open_tables" -a $open_tables -le 1000 ]; then - $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' 2>&1 & + $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' & else echo "Too many open tables: $open_tables" fi @@ -843,7 +875,7 @@ lock_waits() { # ########################################################################### RAN_WITH="" EXIT_REASON="" -TOOL=$(basename $0) +TOOL="pt-stalk" OKTORUN=1 ITER=1 @@ -1104,8 +1136,8 @@ main() { # Execute the program if it was not included from another file. # This makes it possible to include without executing, and thus test. -if [ "$(basename "$0")" = "pt-stalk" ] \ - || [ "$(basename "$0")" = "bash" -a "$_" = "$0" ]; then +if [ "${0##*/}" = "$TOOL" ] \ + || [ "${0##*/}" = "bash" -a "$_" = "$0" ]; then # Check that mysql and mysqladmin are in PATH. If not, we're # already dead in the water, so don't bother with cmd line opts, diff --git a/lib/bash/alt_cmds.sh b/lib/bash/alt_cmds.sh index c5a88f5e..1ae378a7 100644 --- a/lib/bash/alt_cmds.sh +++ b/lib/bash/alt_cmds.sh @@ -23,12 +23,31 @@ set -u +# Global variables. +CMD_PIDOF="$(which pidof)" +CMD_PGREP="$(which pgrep)" + # seq N, return 1, ..., 5 _seq() { local i="$1" awk "BEGIN { for(i=1; i<=$i; i++) print i; }" } +_pidof() { + local proc="$1" # process name + local pat="${2:-""}" # pattern in case we must grep for proc + + local pid="" + + [ "$CMD_PIDOF" ] && pid=$(pidof -s "$proc"); + + [ -z "$pid" ] && [ "$CMD_PGREP" ] && pid=$(pgrep -o -x "$proc"); + + [ -z "$pid" ] && pid=$(ps -eaf | grep "$pat" | grep -v mysqld_safe | awk '{print $2}' | head -n1) + + echo $pid +} + # ########################################################################### # End alt_cmds package # ########################################################################### diff --git a/lib/bash/collect.sh b/lib/bash/collect.sh index 41d43052..cc774103 100644 --- a/lib/bash/collect.sh +++ b/lib/bash/collect.sh @@ -26,6 +26,7 @@ set -u # Global variables. CMD_GDB="$(which gdb)" CMD_IOSTAT="$(which iostat)" +CMD_LSOF="$(which lsof)" CMD_MPSTAT="$(which mpstat)" CMD_MYSQL="$(which mysql)" CMD_MYSQLADMIN="$(which mysqladmin)" @@ -33,21 +34,19 @@ CMD_OPCONTROL="$(which opcontrol)" CMD_OPREPORT="$(which opreport)" CMD_PMAP="$(which pmap)" CMD_STRACE="$(which strace)" +CMD_SYSCTL="$(which sysctl)" CMD_TCPDUMP="$(which tcpdump)" CMD_VMSTAT="$(which vmstat)" +# Try to find command manually. +[ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl" + collect() { local d="$1" # directory to save results in local p="$2" # prefix for each result file - # Get pidof mysqld; pidof doesn't exist on some systems. We try our best... - local mysqld_pid=$(pidof -s mysqld); - if [ -z "$mysqld_pid" ]; then - mysqld_pid=$(pgrep -o -x mysqld); - fi - if [ -z "$mysqld_pid" ]; then - mysqld_pid=$(ps -eaf | grep 'mysql[d]' | grep -v mysqld_safe | awk '{print $2}' | head -n1); - fi + # Get pidof mysqld. + local mysqld_pid=$(_pidof mysqld mysql[d]); # Get memory allocation info before anything else. if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then @@ -72,7 +71,7 @@ collect() { # Get MySQL's variables if possible. Then sleep long enough that we probably # complete SHOW VARIABLES if all's well. (We don't want to run mysql in the # foreground, because it could hang.) - $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" & sleep .2 # Get the major.minor version number. Version 3.23 doesn't matter for our @@ -89,13 +88,14 @@ collect() { local tail_error_log_pid="" if [ "$mysql_error_log" ]; then echo "The MySQL error log seems to be ${mysql_error_log}" - tail -f "$mysql_error_log" >"$d/$p-log_error" 2>&1 & + tail -f "$mysql_error_log" >"$d/$p-log_error" & tail_error_log_pid=$! + # Send a mysqladmin debug to the server so we can potentially learn about # locking etc. $CMD_MYSQLADMIN $EXT_ARGV debug else - echo "Could not find the MySQL error log" + echo "Could not find the MySQL error log" >&2 fi # Get a sample of these right away, so we can get these without interaction @@ -106,9 +106,9 @@ collect() { else local mutex="SHOW MUTEX STATUS" fi - $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" 2>&1 & - $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" 2>&1 & - open_tables >> "$d/$p-opentables1" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" & + $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" & + open_tables >> "$d/$p-opentables1" & # If TCP dumping is specified, start that on the server's port. local tcpdump_pid="" @@ -130,27 +130,32 @@ collect() { fi elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then # Don't run oprofile and strace at the same time. - $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" 2>&1 & + $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" & local strace_pid=$! fi # Grab a few general things first. Background all of these so we can start # them all up as quickly as possible. - ps -eaf >> "$d/$p-ps" 2>&1 & - sysctl -a >> "$d/$p-sysctl" 2>&1 & - top -bn1 >> "$d/$p-top" 2>&1 & - lsof -nP -p $mysqld_pid -bw >> "$d/$p-lsof" 2>&1 & + ps -eaf >> "$d/$p-ps" & + top -bn1 >> "$d/$p-top" & + + if [ "$CMD_LSOF" ]; then + $CMD_LSOF -nP -p $mysqld_pid -bw >> "$d/$p-lsof" & + fi + if [ "$CMD_SYSCTL" ]; then + $CMD_SYSCTL -a >> "$d/$p-sysctl" & + fi if [ "$CMD_VMSTAT" ]; then - $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" 2>&1 & - $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" 2>&1 & + $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" & + $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" & fi if [ "$CMD_IOSTAT" ]; then - $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" 2>&1 & - $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" 2>&1 & + $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" & + $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" & fi if [ "$CMD_MPSTAT" ]; then - $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" 2>&1 & - $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" 2>&1 & + $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" & + $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" & fi # Collect multiple snapshots of the status variables. We use @@ -159,7 +164,7 @@ collect() { # get and keep a connection to the database; in troubled times # the database tends to exceed max_connections, so reconnecting # in the loop tends not to work very well. - $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" 2>&1 & + $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" & local mysqladmin_pid=$! local have_lock_waits_table=0 @@ -186,36 +191,41 @@ collect() { sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}') local ts="$(date +"TS %s.%N %F %T")" - # Collect the stuff for this cycle + # ##################################################################### + # Collect data for this cycle. + # ##################################################################### + if [ -d "/proc" ]; then if [ -f "/proc/diskstats" ]; then - (cat /proc/diskstats 2>&1; echo $ts) >> "$d/$p-diskstats" & + (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & fi if [ -f "/proc/stat" ]; then - (cat /proc/stat 2>&1; echo $ts) >> "$d/$p-procstat" & + (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & fi if [ -f "/proc/vmstat" ]; then - (cat /proc/vmstat 2>&1; echo $ts) >> "$d/$p-procvmstat" & + (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & fi if [ -f "/proc/meminfo" ]; then - (cat /proc/meminfo 2>&1; echo $ts) >> "$d/$p-meminfo" & + (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & fi if [ -f "/proc/slabinfo" ]; then - (cat /proc/slabinfo 2>&1; echo $ts) >> "$d/$p-slabinfo" & + (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & fi if [ -f "/proc/interrupts" ]; then - (cat /proc/interrupts 2>&1; echo $ts) >> "$d/$p-interrupts" & + (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & fi fi - (df -h 2>&1; echo $ts) >> "$d/$p-df" & - (netstat -antp 2>&1; echo $ts) >> "$d/$p-netstat" & - (netstat -s 2>&1; echo $ts) >> "$d/$p-netstat_s" & - ($CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \ - >> "$d/$p-processlist" + (echo $ts; df -h) >> "$d/$p-df" & + + (echo $ts; netstat -antp) >> "$d/$p-netstat" & + (echo $ts; netstat -s) >> "$d/$p-netstat_s" & + + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ + >> "$d/$p-processlist" & if [ $have_lock_waits_table -eq 1 ]; then - (lock_waits 2>&1; echo $ts) >>"$d/$p-lock-waits" + (echo $ts; lock_waits) >>"$d/$p-lock-waits" & fi done echo "Loop end: $(date +'TS %s.%N %F %T')" @@ -252,23 +262,35 @@ collect() { kill -s 18 $mysqld_pid fi - $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" 2>&1 & - $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" 2>&1 & - open_tables >> "$d/$p-opentables2" 2>&1 & + $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" & + $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" & + open_tables >> "$d/$p-opentables2" & # Kill backgrounded tasks. kill $mysqladmin_pid [ "$tail_error_log_pid" ] && kill $tail_error_log_pid - [ "$tcpdump_pid" ] && kill $tcpdump_pid + [ "$tcpdump_pid" ] && kill $tcpdump_pid # Finally, record what system we collected this data from. hostname > "$d/$p-hostname" + + # Remove "empty" files, i.e. ones that are truly empty or + # just contain timestamp lines. When a command above fails, + # it may leave an empty file. + for file in "$d/$p-"*; do + # If there's not at least 1 line that's not a TS, + # then the file is empty. + if [ -z "$(grep -v '^TS ' --max-count 1 "$file")" ]; then + log "Removing empty file $file"; + rm "$file" + fi + done } open_tables() { local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}') if [ -n "$open_tables" -a $open_tables -le 1000 ]; then - $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' 2>&1 & + $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' & else echo "Too many open tables: $open_tables" fi diff --git a/t/lib/bash/collect.sh b/t/lib/bash/collect.sh index b944fa3b..0564c666 100644 --- a/t/lib/bash/collect.sh +++ b/t/lib/bash/collect.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -TESTS=19 +TESTS=20 TMPFILE="$TEST_TMPDIR/parse-opts-output" TMPDIR="$TEST_TMPDIR" @@ -108,6 +108,20 @@ cmd_ok \ local iters=$(cat $p-df | grep -c '^TS ') is "$iters" "1" "1 iteration/1s run time" +empty_files=0 +for file in $p-*; do + if ! [ -s $file ]; then + empty_files=1 + break + fi + if [ -z "$(grep -v '^TS ' --max-count 1 $file)" ]; then + empty_files=1 + break + fi +done + +is "$empty_files" "0" "No empty files" + # ########################################################################### # Try longer run time. # ###########################################################################