#!/bin/bash
proc_img_path=$0
if [[ ${proc_img_path} =~ .*"ds_am.cleanup" ]]; then
bindir="/opt/ds_agent"
confdir="/var/opt/ds_agent/am"
bin="ds_am"
elif [[ ${proc_img_path} =~ .*"vls_am.cleanup" ]]; then
bindir="/opt/TrendMicro/vls_agent"
confdir="/var/opt/TrendMicro/vls_agent/am"
bin="vls_am"
fi
function log_stack_trace_and_rm_core()
{
local ds_am_exec="$1"
local enable_gdb_bt=0 # It takes too long to generate gdb backtrace
local FIND_AND_SORT_CORE_FILES="find ${confdir} -name 'core.?*' -exec ls -1tc {} +"
local CORE_MAX=${VMPD_CORE_MAX:-3}
local TAIL_LINE_START=$(( $CORE_MAX + 1 ))
local TAIL_WITH_OFFSET="tail -n +$TAIL_LINE_START"
local core_files_to_rm=$(eval $FIND_AND_SORT_CORE_FILES \
| $TAIL_WITH_OFFSET)
for core in $core_files_to_rm ; do
if [ ${enable_gdb_bt} -eq 1 -a ! -z "`which gdb 2> /dev/null`" ]; then
# Create tmp text file for gdb output.
local gdb_out_filename="${confdir}/gdb_bt.$(basename $ds_am_exec)-$(basename $core).txt"
echo "Stack trace for '$core':" >$gdb_out_filename
# Runs full backtrace for all threads. Retrieved from:
# http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively
gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" "$ds_am_exec" "$core" 2>&1 >>$gdb_out_filename
fi
rm -f "$core"
done
}
function rm_bt()
{
local FIND_AND_SORT_BT_FILES="find ${confdir} -name 'bt.?*' -exec ls -1tc {} +"
local BT_MAX=${VMPD_BT_MAX:-10}
local TAIL_LINE_START=$(( $BT_MAX + 1 ))
local TAIL_WITH_OFFSET="tail -n +$TAIL_LINE_START"
local bt_files_to_rm=$(eval $FIND_AND_SORT_BT_FILES \
| $TAIL_WITH_OFFSET)
for bt in $bt_files_to_rm ; do
rm -f "$bt"
done
}
function rm_gdb_bt()
{
local FIND_AND_SORT_GDB_BT_FILES="find ${confdir} -name 'gdb_bt.?*' -exec ls -1tc {} +"
local GDB_BT_MAX=${VMPD_GDB_BT_MAX:-10}
local TAIL_LINE_START=$(( $GDB_BT_MAX + 1 ))
local TAIL_WITH_OFFSET="tail -n +$TAIL_LINE_START"
local gdb_bt_files_to_rm=$(eval $FIND_AND_SORT_GDB_BT_FILES \
| $TAIL_WITH_OFFSET)
for gdb_bt in $gdb_bt_files_to_rm ; do
rm -f "$gdb_bt"
done
}
log_stack_trace_and_rm_core ${bindir}/${bin}
rm_bt
rm_gdb_bt