sybtop
For those of you who prefer the good old-fashioned command line, rather than all that fancy graphical user interface stuff, here is a handy UNIX script for displaying processes on a Sybase Adaptive Server Enterprise server.
It displays in a similar format to the "top" UNIX utility, and will refresh periodically. Processes are sorted by priority:
- Those being blocked
- Those blocking other processes
- User processes
- Internal threads
It has been tested on a 15.0 server, but will probably work OK on earlier versions - you may need to change or remove some of the columns from the query if it doesn't. Some columns have been truncated as they are quite long, and you may have to do some more truncation or remove columns if it doesn't all display nicely on your screen.
#!/bin/sh
#
# sybtop
#
# This script displays the state of processes on a Sybase ASE server, using a
# "top"-like format.
#
# This script is originally copyright (c) 2008, JL. It may be copied and used freely, and
# modified anyway you wish, as long as this original copyright notice remains intact.
#
# www.sturnus.co.uk
#
#
# Modification History
# Date Who What
# ---------- --- ---
# 2008-10-16 JL First written.
#
#
# Uncomment for debugging purposes
#set -x
##### Set these according to your environment #####
export SYBSERVER="TEST" # The name of the Sybase server to which you are connecting
# (in your interfaces file)
export SYBLOGIN="sa" # The server login name
export SYBPWFILE=~/.sapw # The path of a file containing the login password
export DISPLAYLINES=15 # The number of lines that you wish to be displayed on the
# screen at any time
export REFRESHINTERVAL=5 # How long to wait between refreshes, in seconds
##### Functions #####
signal_handler()
{
# Just clean up the temporary file, but don't bother generating
# an error if it doesn't exist.
rm -f $TMPFILEPATH
echo "$0 caught signal $1 - exiting"
exit 0
}
##### Start #####
# Generate a temporary filename. This is used by this script to store
# the results of the SQL query.
export TMPFILEPATH="/tmp/sybtop$$"
# Trap various signals, so that if the script exits before we have had a chance
# to remove the temporary file, it can be cleaned up.
trap "signal_handler SIGHUP" SIGHUP
trap "signal_handler SIGINT" SIGINT
trap "signal_handler SIGKILL" SIGKILL
trap "signal_handler SIGTERM" SIGTERM
# Loop forever, or until the script is killed (e.g. with Control-C)
while [ 1 ]
do
#
# Run the query, sending the result to the temporary file. We do this to
# double-buffer the output, so the screen updates quickly even if the query
# takes a while to run or it is blocked.
#
# The strange construct with the sub-shell is so that we can:
# - Pipe the password through to "isql" without it appearing on the
# screen, even if debugging is enabled (with "set -x").
# - Use the "<< END_OF_SQL" construct (and thus show the query nicely
# formatted over several lines).
#
( cat $SYBPWFILE; cat << END_OF_SQL
SELECT "SPID" = spid,
"Login" = convert( char(10), isnull( suser_name( suid ), "" ) ),
"Database" = convert( char(10), db_name( dbid ) ),
"Command" = convert( char(20), cmd ),
"Status" = convert( char(10), status ),
"CPU" = cpu,
"I/O" = physical_io,
"Blocked" = CASE
WHEN blocked > 0
THEN convert( char(5), blocked ) + " : " +
convert( varchar(5), time_blocked ) + " s"
ELSE ""
END,
"Blocking" = isnull( convert( char(5),
nullif( ( SELECT count(*)
FROM master..sysprocesses p2
WHERE p2.blocked = p1.spid ), 0 ) ), "" ),
"Program" = convert( char(10), isnull( program_name, "" ) ),
"Client App" = convert( char(10), clientapplname ),
"IP" = convert( char(15), isnull( ipaddr, "" ) )
FROM master..sysprocesses p1
ORDER BY CASE
WHEN blocked > 0
THEN 0
ELSE 1
END,
time_blocked DESC,
9 DESC,
CASE
WHEN suid > 0
THEN 0
ELSE 1
END,
spid
go
END_OF_SQL
) | isql -S $SYBSERVER -U $SYBLOGIN -w 1000 \
| grep -v "^Password:" \
| grep -v "rows affected)$" > $TMPFILEPATH
# Determine how many lines are in the output file
TOTALLINES=`cat $TMPFILEPATH | wc -l`
# Clear the screen ready to display the update
clear
# We only display the top DISPLAYLINES processes, but if there are more than
# this in total then we want to know how many so we can show it on screen.
echo "----- $0: `date +%Y-%m-%d:%H:%M:%S` -----"
echo ""
head -$DISPLAYLINES $TMPFILEPATH
if [ $TOTALLINES -gt $DISPLAYLINES ]
then
NONDISPLAYLINES=`expr $TOTALLINES - $DISPLAYLINES`
echo "... $NONDISPLAYLINES more lines(s) ..."
fi
# Remove the temporary file
rm $TMPFILEPATH
# Sleep for the refresh interval before re-running the query
sleep $REFRESHINTERVAL
done
echo "Loop exited prematurely"
exit 2