mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-09 04:59:04 +00:00
Update Bash libs. Quote stuff in tool's code. Remove flock.
This commit is contained in:
151
bin/pt-stalk
151
bin/pt-stalk
@@ -22,16 +22,16 @@ EXIT_STATUS=0
|
||||
|
||||
log() {
|
||||
TS=$(date +%F-%T | tr :- _);
|
||||
echo "$TS $1"
|
||||
echo "$TS $*"
|
||||
}
|
||||
|
||||
warn() {
|
||||
log "$1" >&2
|
||||
EXIT_STATUS=$((EXIT_STATUS | 1))
|
||||
log "$*" >&2
|
||||
EXIT_STATUS=1
|
||||
}
|
||||
|
||||
die() {
|
||||
warn "$1"
|
||||
warn "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -58,19 +58,19 @@ OPT_VERSION="no" # If --version was specified
|
||||
OPT_HELP="no" # If --help was specified
|
||||
|
||||
usage() {
|
||||
local file=$1
|
||||
local file="$1"
|
||||
|
||||
local usage=$(grep '^Usage: ' $file)
|
||||
local usage=$(grep '^Usage: ' "$file")
|
||||
echo $usage >&2
|
||||
echo >&2
|
||||
echo "For more information, 'man $TOOL' or 'perldoc $file'." >&2
|
||||
}
|
||||
|
||||
usage_or_errors() {
|
||||
local file=$1
|
||||
local file="$1"
|
||||
|
||||
if [ "$OPT_VERSION" = "yes" ]; then
|
||||
local version=$(grep '^pt-[^ ]\+ [0-9]' $file)
|
||||
local version=$(grep '^pt-[^ ]\+ [0-9]' "$file")
|
||||
echo "$version"
|
||||
return 1
|
||||
fi
|
||||
@@ -91,7 +91,7 @@ usage_or_errors() {
|
||||
|
||||
if [ $OPT_ERRS -gt 0 ]; then
|
||||
echo >&2
|
||||
usage $file
|
||||
usage "$file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -99,14 +99,14 @@ usage_or_errors() {
|
||||
}
|
||||
|
||||
parse_options() {
|
||||
local file=$1
|
||||
local file="$1"
|
||||
shift
|
||||
|
||||
mkdir $TMPDIR/po/ 2>/dev/null
|
||||
rm -rf $TMPDIR/po/*
|
||||
mkdir "$TMPDIR/po/" 2>/dev/null
|
||||
rm -rf "$TMPDIR"/po/*
|
||||
(
|
||||
export PO_DIR="$TMPDIR/po"
|
||||
cat $file | perl -ne '
|
||||
cat "$file" | perl -ne '
|
||||
BEGIN { $/ = ""; }
|
||||
next unless $_ =~ m/^=head1 OPTIONS/;
|
||||
while ( defined(my $para = <>) ) {
|
||||
@@ -137,13 +137,13 @@ parse_options() {
|
||||
'
|
||||
)
|
||||
|
||||
for opt_spec in $(ls $TMPDIR/po/); do
|
||||
for opt_spec in $(ls "$TMPDIR/po/"); do
|
||||
local opt=""
|
||||
local default_val=""
|
||||
local neg=0
|
||||
while read line; do
|
||||
local key=`echo $line | cut -d ':' -f 1`
|
||||
local val=`echo $line | cut -d ':' -f 2`
|
||||
local key=$(echo $line | cut -d ':' -f 1)
|
||||
local val=$(echo $line | cut -d ':' -f 2)
|
||||
case "$key" in
|
||||
long)
|
||||
opt=$(echo $val | sed 's/-/_/g' | tr [:lower:] [:upper:])
|
||||
@@ -166,7 +166,7 @@ parse_options() {
|
||||
echo "Invalid attribute in $TMPDIR/po/$opt_spec: $line" >&2
|
||||
exit 1
|
||||
esac
|
||||
done < $TMPDIR/po/$opt_spec
|
||||
done < "$TMPDIR/po/$opt_spec"
|
||||
|
||||
if [ -z "$opt" ]; then
|
||||
echo "No long attribute in option spec $TMPDIR/po/$opt_spec" >&2
|
||||
@@ -216,7 +216,7 @@ parse_options() {
|
||||
if [ -f "$TMPDIR/po/$opt" ]; then
|
||||
spec="$TMPDIR/po/$opt"
|
||||
else
|
||||
spec=$(grep "^short form:-$opt\$" $TMPDIR/po/* | cut -d ':' -f 1)
|
||||
spec=$(grep "^short form:-$opt\$" "$TMPDIR"/po/* | cut -d ':' -f 1)
|
||||
if [ -z "$spec" ]; then
|
||||
OPT_ERRS=$(($OPT_ERRS + 1))
|
||||
echo "Unknown option: $real_opt" >&2
|
||||
@@ -224,7 +224,7 @@ parse_options() {
|
||||
fi
|
||||
fi
|
||||
|
||||
required_arg=$(cat $spec | grep '^type:' | cut -d':' -f2)
|
||||
local required_arg=$(cat $spec | awk -F: '/^type:/{print $2}')
|
||||
if [ -n "$required_arg" ]; then
|
||||
if [ $# -eq 0 ]; then
|
||||
OPT_ERRS=$(($OPT_ERRS + 1))
|
||||
@@ -306,7 +306,7 @@ rm_tmpdir() {
|
||||
set -u
|
||||
|
||||
_seq() {
|
||||
local i=$1
|
||||
local i="$1"
|
||||
awk "BEGIN { for(i=1; i<=$i; i++) print i; }"
|
||||
}
|
||||
|
||||
@@ -327,22 +327,22 @@ _seq() {
|
||||
set -u
|
||||
|
||||
disk_space() {
|
||||
local filesystem=${1:-"$PWD"}
|
||||
df -P -k $filesystem
|
||||
local filesystem="${1:-$PWD}"
|
||||
df -P -k "$filesystem"
|
||||
}
|
||||
|
||||
check_disk_space() {
|
||||
local file=$1
|
||||
local mb=${2:-"0"}
|
||||
local pc=${3:-"0"}
|
||||
local mb_margin=${4:-"0"}
|
||||
local file="$1"
|
||||
local mb="${2:-0}"
|
||||
local pc="${3:-0}"
|
||||
local mb_margin="${4:-0}"
|
||||
|
||||
local kb=$(($mb * 1024))
|
||||
local kb_margin=$(($mb_margin * 1024))
|
||||
|
||||
local kb_used=$(cat $file | awk '/^\//{print $3}');
|
||||
local kb_free=$(cat $file | awk '/^\//{print $4}');
|
||||
local pc_used=$(cat $file | awk '/^\//{print $5}' | sed -e 's/%//g');
|
||||
local kb_used=$(cat "$file" | awk '/^\//{print $3}');
|
||||
local kb_free=$(cat "$file" | awk '/^\//{print $4}');
|
||||
local pc_used=$(cat "$file" | awk '/^\//{print $5}' | sed -e 's/%//g');
|
||||
|
||||
if [ "$kb_margin" -gt "0" ]; then
|
||||
local kb_total=$(($kb_used + $kb_free))
|
||||
@@ -379,12 +379,12 @@ check_disk_space() {
|
||||
set -u
|
||||
|
||||
make_pid_file() {
|
||||
local file=$1
|
||||
local pid=$2
|
||||
local file="$1"
|
||||
local pid="$2"
|
||||
|
||||
|
||||
if [ -f "$file" ]; then
|
||||
local old_pid=$(cat $file)
|
||||
local old_pid=$(cat "$file")
|
||||
if [ -z "$old_pid" ]; then
|
||||
die "PID file $file already exists but it is empty"
|
||||
else
|
||||
@@ -398,13 +398,13 @@ make_pid_file() {
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "$pid" > $file
|
||||
echo "$pid" > "$file"
|
||||
}
|
||||
|
||||
remove_pid_file() {
|
||||
local file=$1
|
||||
local file="$1"
|
||||
if [ -f "$file" ]; then
|
||||
rm $file
|
||||
rm "$file"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -437,8 +437,8 @@ CMD_TCPDUMP=${CMD_TCPDUMP:-"tcpdump"}
|
||||
CMD_VMSTAT=${CMD_VMSTAT:-"vmstat"}
|
||||
|
||||
collect() {
|
||||
local d=$1 # directory to save results in
|
||||
local p=$2 # prefix for each result file
|
||||
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
|
||||
@@ -448,7 +448,7 @@ collect() {
|
||||
mysqld_pid=$(ps -eaf | grep 'mysql[d]' | grep -v mysqld_safe | awk '{print $2}' | head -n1);
|
||||
fi
|
||||
|
||||
if [ -x "$CMD_PMAP" -a "$mysqld_pid" ]; then
|
||||
if [ "$mysqld_pid" ]; then
|
||||
if $CMD_PMAP --help 2>&1 | grep -- -x >/dev/null 2>&1 ; then
|
||||
$CMD_PMAP -x $mysqld_pid > "$d/$p-pmap"
|
||||
else
|
||||
@@ -532,7 +532,7 @@ collect() {
|
||||
|
||||
local have_lock_waits_table=0
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW TABLES FROM INFORMATION_SCHEMA" \
|
||||
| grep -qi "INNODB_LOCK_WAITS"
|
||||
| grep -i "INNODB_LOCK_WAITS" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
have_lock_waits_table=1
|
||||
fi
|
||||
@@ -658,7 +658,7 @@ lock_waits() {
|
||||
# Global variables
|
||||
# ###########################################################################
|
||||
EXIT_REASON=""
|
||||
TOOL=`basename $0`
|
||||
TOOL=$(basename $0)
|
||||
OKTORUN=1
|
||||
ITER=1
|
||||
|
||||
@@ -667,11 +667,11 @@ ITER=1
|
||||
# ###########################################################################
|
||||
|
||||
grep_processlist() {
|
||||
local file=$1
|
||||
local col=$2
|
||||
local pat=${3:-""}
|
||||
local gt=${4:-0}
|
||||
local quiet=${5:-0}
|
||||
local file="$1"
|
||||
local col="$2"
|
||||
local pat="${3:-""}"
|
||||
local gt="${4:-0}"
|
||||
local quiet="${5:-0}"
|
||||
|
||||
awk "
|
||||
BEGIN {
|
||||
@@ -720,12 +720,14 @@ set_trg_func() {
|
||||
}
|
||||
|
||||
trg_status() {
|
||||
local var=$1
|
||||
mysqladmin $EXT_ARGV extended-status | grep "$OPT_VARIABLE " | awk '{print $4}'
|
||||
local var="$1"
|
||||
mysqladmin $EXT_ARGV extended-status \
|
||||
| grep "$OPT_VARIABLE " \
|
||||
| awk '{print $4}'
|
||||
}
|
||||
|
||||
trg_processlist() {
|
||||
local var=$1
|
||||
local var="$1"
|
||||
local tmpfile="$TMPDIR/processlist"
|
||||
mysqladmin $EXT_ARGV processlist > $tmpfile-1
|
||||
grep_processlist $tmpfile-1 $var $OPT_MATCH 0 0 > $tmpfile-2
|
||||
@@ -754,8 +756,8 @@ oktorun() {
|
||||
}
|
||||
|
||||
sleep_ok() {
|
||||
local seconds=$1
|
||||
local msg=${2:-""}
|
||||
local seconds="$1"
|
||||
local msg="${2:-""}"
|
||||
if oktorun; then
|
||||
if [ -n "$msg" ]; then
|
||||
log "$msg"
|
||||
@@ -765,11 +767,18 @@ sleep_ok() {
|
||||
}
|
||||
|
||||
purge_samples() {
|
||||
local dir="$1"
|
||||
local retention_time="$2"
|
||||
|
||||
# Delete collect files which more than --retention-time days old.
|
||||
find "$OPT_DEST" -type f -mtime +$OPT_RETENTION_TIME -exec rm -f '{}' \;
|
||||
if [ -d "/var/lib/oprofile/samples" ]; then
|
||||
find "/var/lib/oprofile/samples" -type d -name 'pt_collect_*' \
|
||||
-depth -mtime +$OPT_RETENTION_TIME -exec rm -f '{}' \;
|
||||
find "$dir" -type f -mtime +$retention_time -exec rm -f '{}' \;
|
||||
|
||||
local oprofile_dir="/var/lib/oprofile/samples"
|
||||
if [ -d "$oprofile_dir" ]; then
|
||||
# "pt_collect_" here needs to match $CMD_OPCONTROL --save=pt_collect_$p
|
||||
# in collect(). TODO: fix this
|
||||
find "$oprofile_dir" -type d -name 'pt_collect_*' \
|
||||
-depth -mtime +$retention_time -exec rm -f '{}' \;
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -815,20 +824,20 @@ stalk() {
|
||||
# ##################################################################
|
||||
# Start collecting, maybe.
|
||||
# ##################################################################
|
||||
local prefix=${OPT_PREFIX:-"$(date +%F-%T | tr :- _)"}
|
||||
local prefix="${OPT_PREFIX:-$(date +%F-%T | tr :- _)}"
|
||||
log "Collect triggered"
|
||||
|
||||
# Check if we'll have enough disk space to collect. Disk space
|
||||
# is also checked every interval while collecting.
|
||||
local margin="20" # default 20M margin, unless:
|
||||
if [ -n "$last_prefix" ]; then
|
||||
margin=$(du -mc $OPT_DEST/$last_prefix-* | tail -n 1 | awk '{print $1'})
|
||||
margin=$(du -mc "$OPT_DEST"/"$last_prefix"-* | tail -n 1 | awk '{print $1'})
|
||||
fi
|
||||
disk_space $OPT_DEST > $OPT_DEST/$prefix-disk-space
|
||||
check_disk_space \
|
||||
$OPT_DEST/$prefix-disk-space \
|
||||
"$OPT_DISK_BYTE_LIMIT" \
|
||||
"$OPT_DISK_PCT_LIMIT" \
|
||||
disk_space "$OPT_DEST" > "$OPT_DEST/$prefix-disk-space"
|
||||
check_disk_space \
|
||||
"$OPT_DEST/$prefix-disk-space" \
|
||||
"$OPT_DISK_BYTE_LIMIT" \
|
||||
"$OPT_DISK_PCT_LIMIT" \
|
||||
"$margin" # real used MB + margin MB
|
||||
if [ $? -eq 0 ]; then
|
||||
# There should be enough disk space, so collect.
|
||||
@@ -847,10 +856,8 @@ stalk() {
|
||||
# while its collecting (hopefully --sleep is longer than
|
||||
# --run-time).
|
||||
(
|
||||
flock 200
|
||||
collect $OPT_DEST $prefix
|
||||
) 200>/tmp/percona-toolkit-collect-lockfile \
|
||||
>> "$OPT_DEST/$prefix-output" 2>&1 &
|
||||
collect "$OPT_DEST" "$prefix"
|
||||
) >> "$OPT_DEST/$prefix-output" 2>&1 &
|
||||
else
|
||||
# There will not be enough disk space, so do not collect.
|
||||
warn "Collect canceled because there will not be enough disk space after collecting another $margin MB"
|
||||
@@ -867,7 +874,7 @@ stalk() {
|
||||
fi
|
||||
|
||||
# Purge old collect file between checks.
|
||||
purge_samples
|
||||
purge_samples "$OPT_DEST" "$OPT_RETENTION_TIME"
|
||||
done
|
||||
}
|
||||
|
||||
@@ -927,8 +934,8 @@ if [ "$(basename "$0")" = "pt-stalk" ] \
|
||||
# Parse command line options. We must do this first so we can
|
||||
# see if --daemonize was specified.
|
||||
mk_tmpdir
|
||||
parse_options $0 "$@"
|
||||
usage_or_errors $0
|
||||
parse_options "$0" "$@"
|
||||
usage_or_errors "$0"
|
||||
po_status=$?
|
||||
rm_tmpdir
|
||||
if [ $po_status -ne 0 ]; then
|
||||
@@ -947,17 +954,17 @@ if [ "$(basename "$0")" = "pt-stalk" ] \
|
||||
# the PID in the PID file to check or kill the child
|
||||
# process. So we'll need to update the PID file with
|
||||
# the child's PID.
|
||||
make_pid_file $OPT_PID $$
|
||||
make_pid_file "$OPT_PID" $$
|
||||
|
||||
main "$@" </dev/null 1>>$OPT_LOG 2>&1 &
|
||||
main "$@" </dev/null 1>>"$OPT_LOG" 2>&1 &
|
||||
|
||||
# Update PID file with the child's PID.
|
||||
# The child PID is $BASHPID but that special var is only
|
||||
# in Bash 4+, so we can't rely on it. Consequently, we
|
||||
# use $! to get the PID of the child we just forked.
|
||||
echo "$!" > $OPT_PID
|
||||
echo "$!" > "$OPT_PID"
|
||||
else
|
||||
make_pid_file $OPT_PID $$
|
||||
make_pid_file "$OPT_PID" $$
|
||||
main "$@"
|
||||
fi
|
||||
fi
|
||||
|
Reference in New Issue
Block a user