# # Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 only, as # published by the Free Software Foundation. # # This code is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # version 2 for more details (a copy is included in the LICENSE file that # accompanied this code). # # You should have received a copy of the GNU General Public License version # 2 along with this work; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, # CA 95054 USA or visit www.sun.com if you need additional information or # have any questions. # # setup() { # Verify directory context variables are set if [ "${TESTJAVA}" = "" ] ; then echo "TESTJAVA not set. Test cannot execute. Failed." exit 1 fi if [ "${TESTCLASSES}" = "" ] ; then TESTCLASSES="." fi if [ "${TESTSRC}" = "" ] ; then TESTSRC="." fi OS=`uname -s` case ${OS} in Windows_* | CYGWIN*) PS=";" FS="\\" ;; *) PS=":" FS="/" ;; esac } verify_os() { OS=`uname -s` case ${OS} in Windows_95 | Windows_98 | Windows_ME) echo "Test bypassed: jvmstat feature not supported on ${OS}" exit 0 ;; Windows_* | CYGWIN*) # verify that the tmp directory supports persistent ACLs, which # are required for jvmstat to enable its shared memory feature. # NOTE: FAT type files systems do not support ACLs, but NTFS files # systems do. # echo "temp directory is in: `windir -t`" TMPDRIVE=`windir -t | cut -d: -f1` if [ "${TMPDRIVE}" = "" ] ; then echo "Could not get temp directory drive letter" exit 1 fi echo "temp file system characteristics:" sysinf drives -a | grep "^${TMPDRIVE}" sysinf drives -a | grep "^${TMPDRIVE}" | grep PERSISTENT_ACLS > /dev/null case $? in 0) ;; 1) echo "Test bypassed: jvmstat feature disabled because the temp" echo "directory doesn't support persistent ACLs" exit 0 ;; 2) echo "Could not get temp directory file system features" exit 1 ;; *) echo "Unexpected return code from grep - $?" exit 1 ;; esac ;; esac } # function to kill the process with the given process id kill_proc() { kill_pid=$1 if [ "${kill_pid}" = "" ] then echo "kill_proc(): null pid: ignored" return fi if [ ${kill_pid} -le 0 ] then echo "kill_proc(): invalid pid: ${kill_pid}: ignored" return fi OS=`uname -s` case $OS in Windows_*) case ${SHELL_VERSION} in [1234567].* | 8.[12345].*) # when starting processes in the background, mks creates an # intervening between the parent process and the background # process. The pid acquired for background process as acquired # by the $! shell variable is actually the pid of the invervening # shell and not that of the background process. Sending a specific # signal to the intervening shell will only effects the intervening # shell and not the background process, thus leaving the background # process running. The following code assumes that the pid passed # into this function as ${kill_pid}, was acquired by $!. Therefore, # in order to kill the background process, we must first find the # children of ${kill_pid} (should be only one child) and kill them. ps -o pid,ppid | grep "${kill_pid}$" children=`mks_children ${kill_pid}` echo "killing children of ${kill_pid}: ${children}" for child in ${children} ; do kill_proc_common ${child} done ;; *) # in mks 8.6 and later, the pid returned in $! is now the pid # of the background process and not that of the intervening shell. kill_proc_common ${kill_pid} ;; esac ;; *) kill_proc_common ${kill_pid} ;; esac } mks_children() { ppid=$1 ps -o pid,ppid | grep "${ppid}$" | awk ' BEGIN { pids="" } { pids = pids $1 " " } END { print pids }' } kill_proc_common() { kpid=$1 # verify that the process exists and we can signal it kill -0 ${kpid} 2>/dev/null if [ $? -ne 0 ] then echo "Could not signal >${kpid}<" echo "user id = `id`" echo "process information :" ps -l -p ${kpid} return fi kill -TERM ${kpid} # hit it easy first if [ $? -eq 0 ] then sleep 2 kill -0 ${kpid} 2>/dev/null # check if it's still hanging around if [ $? -eq 0 ] then # it's still lingering, now it it hard kill -KILL ${kpid} 2>/dev/null if [ $? -ne 0 ] then echo "Could not kill ${kpid}!" fi fi else echo "Error sending term signal to ${kpid}!" fi }