File: //usr/syno/sbin/syno_system_dump
#!/bin/bash
system_dump_script=syno_system_dump
log_file=/var/log/syno_sys_status.log
skip_log_file=/var/log/syno_sys_status_skip.log
dump_tmp_log_file=/var/log/dump_tmp_files.log
dump_running=/var/run/lock/syno_system_dump.lock
tehuti_low_mem_counter=/proc/driver/syno_tehuti_low_mem_counter
dump_D_process_call_stack()
{
echo "[date] $(date)"
echo [D state process call stack]
PIDS=$(ps -e -T -o stat,tid | grep ^D | awk '{print $2}')
for i in "${PIDS[@]}"; do
echo "==========="
cmd=$(tr -d '\0' <"/proc/${i}/cmdline")
echo "PID: ${i} cmdline:${cmd}"
cat "/proc/${i}/stack"
done
echo ""
}
get_gateway()
{
# route -n |
while IFS=$'\n' read line
do
echo "$line" | awk '{print $4}' |grep G > /dev/null
if [ 0 -eq $? ]; then
gateway=$(echo "$line" | awk '{print $2}')
break
fi
done < <(route -n)
}
run_dump()
{
echo "[date] $(date)"
echo [ps result]
ps axwf
echo ""
echo [vmstat result]
cat /proc/vmstat
echo ""
echo [interrupts result]
cat /proc/interrupts
echo ""
echo [slabinfo result]
cat /proc/slabinfo
echo ""
echo [memoryinfo result]
cat /proc/meminfo
echo ""
echo [zoneinfo result]
cat /proc/zoneinfo
echo ""
echo [df result]
df_result=$(df -x fuse.gvfsd-fuse -x cifs -x nfs4 -x nfs)
echo "$df_result"
echo ""
echo [df inode result]
df -x fuse.gvfsd-fuse -x cifs -x nfs4 -x nfs -i
echo ""
echo [top result]
/usr/bin/top -b -n 2 -w 1024
echo ""
echo [route result]
route -n
echo ""
echo [ping gateway]
get_gateway
if [ ! -z "$gateway" ]; then
ping -c 3 "$gateway"
echo ""
fi
echo [ifconfig result]
ifconfig -a
echo ""
echo [/tmp big files]
find /tmp -printf '%s %p\n' | sort -nr | head
tmp_percentage=$(echo "$df_result" | grep "% /tmp" | awk '{print $5}' | sed 's/%//')
if [ "$tmp_percentage" -ge 95 ]; then
if [ ! -f /var/run/dump_tmp_time ] || find /var/run/dump_tmp_time -mmin +70 | grep -q dump_tmp_time; then
touch /var/run/dump_tmp_time
{
echo "[date] $(date)"
echo "[find /tmp]"
find /tmp -printf '%s\t%p\n'
} >> $dump_tmp_log_file
fi
fi
if [ -e $tehuti_low_mem_counter ]; then
echo [tehuti packet loss counter]
cat $tehuti_low_mem_counter
echo ""
fi
echo [HW monitor]
cat /run/hwmon/*
echo ""
echo ""
echo ""
}
skip()
{
echo [date] "$(date)"
echo [ps result]
ps axwf
echo
}
add_crontab()
{
echo */3$'\t'*$'\t'*$'\t'*$'\t'*$'\t'root$'\t'/usr/syno/sbin/$system_dump_script >> /etc/crontab
synoservice --reload crond
}
remove_crontab()
{
sed -i /$system_dump_script/d /etc/crontab
synoservice --reload crond
}
if [ "$1" = "enable" ]; then
add_crontab
elif [ "$1" = "disable" ]; then
remove_crontab
else
if [ "$1" = "DState" ]; then
DState="true"
fi
(
if flock -n -x 9
then
if [ "$DState" = "true" ]; then
dump_D_process_call_stack >> $log_file
else
run_dump >> $log_file
fi
else
skip >> $skip_log_file
fi
) 9>$dump_running
fi