#!/bin/sh
#==============================================================================
# Copyright and license info is available in the LICENSE file included with
# the Server Deployment Package (SDP), and also available online:
# https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE
#------------------------------------------------------------------------------
# The RCSCHANGE and RCSDATE values are copied verbatim from the originating
# Helix Server, and read-only elsewhere. Do not change these and do not
# apply the '+k' file type modifer to this file.
RCSCHANGE="$Change: 1262283 $"
RCSDATE="$Date: 2015/11/05 $"
export SDP_INSTANCE=${SDP_INSTANCE:-Undefined}
export SDP_INSTANCE=${1:-$SDP_INSTANCE}
if [[ $SDP_INSTANCE == Undefined ]]; then
echo "Instance parameter not supplied."
echo "You must supply the Perforce instance as a parameter to this script."
exit 1
fi
. /p4/common/bin/p4_vars $SDP_INSTANCE
. /p4/common/bin/backup_functions.sh
LOGFILE=$LOGS/p4dstate-`date +%Y%m%d%H%M%S`.out
TIMEOUT=120
SIGKILL=9
SIGTERM=15
plural()
{
if [ $1 != "1" ]
then
printf "%s %ss" $1 $2
else
if [ $# -lt 3 ]
then
printf "%s %s" $1 $2
else
printf "%s" $3
fi
fi
}
header()
{
printf "Output from "
if [ $# -gt 1 ]
then
plural $2 second
printf " of "
fi
printf "\"%s\"" "$1"
if [ $# -gt 2 ]
then
printf " repeated every "
plural $3 second second
fi
printf ", starting at %s\n" "`date "+%Y/%m/%d %H:%M:%S"`"
}
initmask()
{
printf "%.$1d" 0
}
setbit()
{
masklen=`expr length $1`
if [ $2 -gt 1 ]
then
printf "%s" `expr substr $1 1 \`expr $2 - 1\``
fi
printf "1"
if [ $2 -lt $masklen ]
then
printf "%s" `expr substr $1 \`expr $2 + 1\` \`expr $masklen - $2\``
fi
}
isset()
{
test `expr substr $1 $2 1` = "1"
}
sleepkill()
{
sleep $1 > /dev/null # redirection required so as to not stall pipe
kill -$2 $3 2> /dev/null
}
run()
{
header "$1" $2 $3
if [ $# -lt 3 ]
then
$1 2>&1 &
else
{
while [ 1 ]
do
date +%H:%M:%S
$1 2>&1
printf "=======\n"
sleep $3
done
} &
fi
runpid=$!
reportkills=`initmask 64`
if [ $# -gt 1 ]
then
reportkills=`setbit $reportkills $SIGKILL`
sleepkill $2 $SIGTERM $runpid
{
sleepkill $TIMEOUT $SIGKILL $runpid
} &
else
reportkills=`setbit $reportkills $SIGKILL`
reportkills=`setbit $reportkills $SIGTERM`
{
sleepkill $TIMEOUT $SIGTERM $runpid
sleepkill $TIMEOUT $SIGKILL $runpid
} &
fi
waitpid=$!
wait $runpid 2> /dev/null
signal=`expr $? - 128`
test $signal -gt 0 && isset $reportkills $signal &&
{
printf "Command timed out; terminated using \"kill %s\".\n" -$signal
}
kill $waitpid 2> /dev/null
wait 2> /dev/null
printf "\n"
}
lsofrun()
{
run "lsof -r1 $P4ROOT/* $P4ROOT/server.locks/*/* $P4JOURNAL $P4LOG" 15 \
| grep -v '^tail'
}
getpids()
{
printf "ps -e | grep '%s$'" `echo $P4DBIN | sed 's/.*\/\([^\/]*\)$/\1/'` \
| sh \
| sed 's/^[^0-9]*\([0-9]*\)[^0-9]*.*/\1/'
}
pidruns()
{
getpids | while read pid
do
run "lsof -p $pid"
run "strace -q -p $pid" 0.50
done
}
collectfile()
{
echo $LOGFILE.`printf "%.2d" $1`
}
collect()
{
ncollects=`expr $ncollects + 1`
"$@" > `collectfile $ncollects` &
}
ncollects=0
printf "Collecting p4d state..."
collect run "$P4DBIN -V"
collect run "$P4BIN -V"
collect run "uname -a"
collect run "tail -f -n10000 $P4LOG" 15
collect run "tail -f -n10000 $P4JOURNAL" 15
collect lsofrun
collect pidruns
collect run "ps -elfjH" 15 1
collect run "netstat -antp" 15 1
collect run "tail -f -n10000 /var/log/messages" 15
#
# Depending upon the state of the server, the following commands
# might not behave as expected.
#
collect run "$P4BIN monitor show -el" 15 1
#
# All commands have been started; wait for them to finish.
#
wait
icollect=0
while [ $icollect -lt $ncollects ]
do
icollect=`expr $icollect + 1`
collected=`collectfile $icollect`
cat $collected
rm -f $collected
done \
> $LOGFILE
printf " done.\n"
exit 0
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #10 | 30297 | C. Thomas Tyler |
Released SDP 2023.2.30295 (2024/05/08). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #9 | 29954 | C. Thomas Tyler |
Released SDP 2023.1.29949 (2023/12/01). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #8 | 29891 | C. Thomas Tyler |
Released SDP 2023.1.29699 (2023/07/11). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #7 | 28989 | C. Thomas Tyler |
Released SDP 2022.1.28987 (2022/08/25). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #6 | 28858 | C. Thomas Tyler |
Released SDP 2022.1.28855 (2022/05/27). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #5 | 27761 | C. Thomas Tyler |
Released SDP 2020.1.27759 (2021/05/07). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #4 | 26403 | C. Thomas Tyler |
Released SDP 2019.3.26400 (2020/03/28). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| #3 | 23510 | C. Thomas Tyler |
Released SDP 2018.1.23504 (2018/01/19). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev', with selective removal of work-in-progress files. |
||
| #2 | 19414 | C. Thomas Tyler | Released SDP/MultiArch/2016.1/19410 (2016/05/17). | ||
| #1 | 17315 | C. Thomas Tyler |
Released SDP/MultiArch/2016.1/17297 (2016/02/03). Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'. |
||
| //guest/perforce_software/sdp/dev/Server/Unix/p4/common/bin/p4dstate.sh | |||||
| #1 | 16652 | C. Thomas Tyler |
Added p4dstate.sh to SDP. Changes from originating server (no functionality changes): * Adjusted Copyright message to SDP standard, which references the same basic content. * Added comment clarifying that RCS values are verbatim from the originating Helix Server, and read-only elsewhere. To Do: * Comments and usage instructions needed. * SDP-ifiy it; i.e. have it take an instance parameter, and which point all other settings (path to p4d and p4 executables, P4ROOT and other environment variables) are known. #review @michael_shields @robert_cowham |
||