155 lines
4.8 KiB
Bash
Executable File
155 lines
4.8 KiB
Bash
Executable File
#!/sbin/sh
|
|
#Tag 0x00000800
|
|
#
|
|
# Perform a crash dump save.
|
|
# "$Revision: 1.23 $"
|
|
|
|
#
|
|
# Get the crash directory from the savecore.options file (if any). This
|
|
# way we can set up the savecore.options file in any fashion we want.
|
|
#
|
|
OPTIONS=`cat /etc/config/savecore.options 2> /dev/null`
|
|
CRASHDIR=""
|
|
if [ ! "${OPTIONS}" = "" ] ; then
|
|
for DIR in ${OPTIONS} ; do
|
|
if [ -d "${DIR}" ] ; then
|
|
CRASHDIR="${DIR}"
|
|
fi
|
|
done
|
|
if [ "${CRASHDIR}" = "" ] ; then
|
|
CRASHDIR="/var/adm/crash"
|
|
OPTIONS="${OPTIONS} ${CRASHDIR}"
|
|
fi
|
|
else
|
|
OPTIONS="/var/adm/crash"
|
|
CRASHDIR=${OPTIONS}
|
|
fi
|
|
|
|
#
|
|
# Set the current bounds value, if any.
|
|
#
|
|
BOUNDS=`/sbin/suattr -M dbadmin -c "cat ${CRASHDIR}/bounds" 2> /dev/null`
|
|
BOUNDS=${BOUNDS:=0}
|
|
|
|
#
|
|
# Assign filenames appropriately for the files in ${CRASHDIR} so that
|
|
# we write out the right reports to the right files. Note that the .N
|
|
# extension is whatever bounds value was assigned to this particular
|
|
# system panic or hang.
|
|
#
|
|
# For completeness, the files that can end up in ${CRASHDIR} are:
|
|
#
|
|
# fru.N:
|
|
# The FRU analysis of the hardware on the system if the IP type is
|
|
# valid and results are returned.
|
|
#
|
|
# analysis.N:
|
|
# The full IRIX crash core file report that displays lots of data
|
|
# on what happened when the system crashed. This report can be
|
|
# analyzed by SGI support personnel in order to try and find out
|
|
# why the system either paniced or hung.
|
|
#
|
|
# summary.N:
|
|
# The summary information about a crash, primarily used by the
|
|
# availmon information gathering process. Note that this file
|
|
# is removed as soon as 'availmon' picks it up.
|
|
#
|
|
# unix.N:
|
|
# A copy of /unix from the time of the system crash.
|
|
#
|
|
# vmcore.N.comp:
|
|
# A compressed version of the virtual memory at the time of the
|
|
# system crash. It can be used in combination with unix.N in order
|
|
# to gather details about the machine panic or hang.
|
|
#
|
|
FRU=${CRASHDIR}/fru.${BOUNDS}
|
|
UNIX=${CRASHDIR}/unix.${BOUNDS}
|
|
VMCORE=${CRASHDIR}/vmcore.${BOUNDS}.comp
|
|
ANA=${CRASHDIR}/analysis.${BOUNDS}
|
|
SUM=${CRASHDIR}/summary.${BOUNDS}
|
|
CLG=${CRASHDIR}/crashlog.${BOUNDS}
|
|
|
|
#
|
|
# Flag to determine if we need to update the bounds file or not. This
|
|
# is needed when 'savecore' exits with a status of 2, which means that
|
|
# there isn't enough disk space for a core dump, but there might be
|
|
# enough disk space to save a report.
|
|
#
|
|
UPDATE_BOUNDS=0
|
|
|
|
CONFIG=/etc/config
|
|
IS_ON=/sbin/chkconfig
|
|
|
|
if $IS_ON verbose ; then
|
|
LOGGER='/sbin/lfmt -l savecore -s info'
|
|
else
|
|
LOGGER='/sbin/lfmt -l savecore -s info -G 1'
|
|
fi
|
|
|
|
NOMSGSEVERITY=1 export NOMSGSEVERITY
|
|
|
|
#
|
|
# If 'savecore' is chkconfiged on, run 'savecore', followed by 'icrash',
|
|
# followed by 'fru', checking to make sure that the binaries are installed
|
|
# on a given system. If 'savecore' is chkconfiged off, run 'icrash',
|
|
# followed by 'fru', and then clear the dump out of /dev/swap.
|
|
#
|
|
if $IS_ON savecore || [ ! -f /usr/bin/icrash ] ; then
|
|
/sbin/suattr -M dbadmin -C CAP_MAC_WRITE+ip -c "/usr/etc/savecore ${OPTIONS}"
|
|
if [ $? -eq 1 ] ; then
|
|
exit 1
|
|
elif [ $? -eq 2 ] ; then
|
|
UNIX=/unix
|
|
VMCORE=/dev/swap
|
|
UPDATE_BOUNDS=1
|
|
fi
|
|
if [ -f /usr/bin/icrash ] ; then
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${SUM} ${ANA}"
|
|
/sbin/suattr -M dbadmin -c "/usr/bin/icrash -r -a ${SUM} -w ${ANA} ${UNIX} ${VMCORE}" 2> /dev/null
|
|
if [ $? -eq 0 ] ; then
|
|
${LOGGER} "Created crash report.\n"
|
|
if /sbin/suattr -M dbadmin -c "test -f ${CLG}" ; then
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${CLG}"
|
|
fi
|
|
if [ $UPDATE_BOUNDS -eq 1 ] ; then
|
|
BOUNDS=`expr ${BOUNDS} + 1`
|
|
/sbin/suattr -M dbadmin -c "echo ${BOUNDS} > ${CRASHDIR}/bounds"
|
|
fi
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${FRU}"
|
|
/sbin/suattr -M dbadmin -c "/usr/bin/icrash -S -w ${FRU} -e "fru" ${UNIX} ${VMCORE}" 2> /dev/null
|
|
if [ $? -eq 0 ] ; then
|
|
${LOGGER} "Created fru report.\n"
|
|
else
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${FRU}"
|
|
fi
|
|
else
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${SUM} ${ANA}"
|
|
if /sbin/suattr -M dbadmin -c "test -f ${CLG}" ; then
|
|
/sbin/suattr -M dbadmin -c "/bin/mv ${CLG} ${ANA}"
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
UNIX=/unix
|
|
VMCORE=/dev/swap
|
|
if [ -f /usr/bin/icrash ] ; then
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${SUM} ${ANA}"
|
|
/sbin/suattr -M dbadmin -c "/usr/bin/icrash -r -a ${SUM} -w ${ANA} ${UNIX} ${VMCORE}" 2> /dev/null
|
|
if [ $? -eq 0 ] ; then
|
|
${LOGGER} "Created crash report.\n"
|
|
BOUNDS=`expr ${BOUNDS} + 1`
|
|
/sbin/suattr -M dbadmin -c "echo ${BOUNDS} > ${CRASHDIR}/bounds"
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${FRU}"
|
|
/sbin/suattr -M dbadmin -c "/usr/bin/icrash -S -w ${FRU} -e "fru" ${UNIX} ${VMCORE}" 2> /dev/null
|
|
if [ $? -eq 0 ] ; then
|
|
${LOGGER} "Created fru report.\n"
|
|
else
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${FRU}"
|
|
fi
|
|
else
|
|
/sbin/suattr -M dbadmin -c "/bin/rm -f ${SUM} ${ANA}"
|
|
fi
|
|
/sbin/suattr -M dbadmin -c "/usr/bin/icrash -c ${UNIX} ${VMCORE}" 2> /dev/null
|
|
fi
|
|
fi
|