Skip to content

Instantly share code, notes, and snippets.

@jsianes
Last active October 7, 2015 14:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsianes/69c416a2d6b813d72068 to your computer and use it in GitHub Desktop.
Save jsianes/69c416a2d6b813d72068 to your computer and use it in GitHub Desktop.
Shell script to obtain useful information about a Linux instance for troubleshooting
#!/bin/bash
timestamp() {
TIMESTAMP=`date -u +"%Y-%m-%dT%H:%M:%S.000Z"`
}
line() {
echo "==================================================================================" >>${LOGFILE} 2>${ERROR}
echo "==================================================================================" >>${LOGFILE} 2>${ERROR}
}
sline() {
echo "---------------------------------------------------------------------------------" >>${LOGFILE} 2>${ERROR}
}
bline() {
echo "" >>${LOGFILE} 2>${ERROR}
}
info() {
timestamp
echo "=== ${INFO} - ${TIMESTAMP}" >>${LOGFILE} 2>${ERROR}
}
metadata_request() {
METADATA_OUTPUT=""
REQUEST_OUTPUT=`curl -s --connect-timeout 5 http://169.254.169.254/${URL} | grep -i "Not Found" | wc -l`
if [ ${REQUEST_OUTPUT} -eq 0 ]
then
METADATA_OUTPUT=`curl -s --connect-timeout 5 http://169.254.169.254/${URL}`
fi
}
STRING="$(hostname)-$(date +%s)"
FILENAME="/tmp/${STRING}.tar.gz"
LOGFILE="/tmp/${STRING}.txt"
ERROR="/dev/null"
echo -n "Collecting information ... "
line; INFO="START"; info; line
INFO="Generating \"${FILENAME}\" log file with /var/log content"; info
sudo tar cfz ${FILENAME} /var/log >>${LOGFILE} 2>${ERROR}
METADAOK=`curl --connect-timeout 5 -i http://169.254.169.254/latest/meta-data/ 2>/dev/null | grep "200 OK" | wc -l`
if [ ${METADAOK} -eq 1 ]
then
line; INFO="AWS INSTANCE METADATA"; info; line; bline
echo -n "Instance ID: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/instance-id"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR}
echo -n "Instance type: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/instance-type"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR}
echo -n "AMI: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/ami-id"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR}
echo -n "Placement: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/placement/availability-zone"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR}
echo -n "Private IP: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/local-ipv4"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR}
echo -n "Public IP: " >>${LOGFILE} 2>${ERROR}; URL="latest/meta-data/public-ipv4"; metadata_request; echo ${METADATA_OUTPUT} >>${LOGFILE} 2>${ERROR} ; bline
fi
line; INFO="BOOT INFO"; info; line; bline
echo "Kernel" >>${LOGFILE} 2>${ERROR}; sline
sudo uname -a >>${LOGFILE} 2>${ERROR}; bline
echo "Uptime" >>${LOGFILE} 2>${ERROR}; sline
sudo uptime >>${LOGFILE} 2>${ERROR}; bline
if [ -d /boot ]
then
echo "/boot directory" >>${LOGFILE} 2>${ERROR}; sline
sudo ls -la /boot >>${LOGFILE} 2>${ERROR}; sline; bline
if [ -f /boot/grub/menu.lst ]
then
echo "menu.lst file" >>${LOGFILE} 2>${ERROR}; sline; bline
sudo cat /boot/grub/menu.lst >>${LOGFILE} 2>${ERROR}; sline; bline
fi
fi
echo "Last logins" >>${LOGFILE} 2>${ERROR}; sline
sudo last | head -5 >>${LOGFILE} 2>${ERROR}; bline
line; INFO="PROCESS INFO"; info; line
sudo ps axf -o user,pid,pcpu,pmem,args >>${LOGFILE} 2>${ERROR}; bline
line; INFO="MEMORY"; info; line
sudo free -m >>${LOGFILE} 2>${ERROR}; bline
sudo cat /proc/meminfo >>${LOGFILE} 2>${ERROR}; bline
sudo vmstat >>${LOGFILE} 2>${ERROR}; bline
CHECK=`sudo swapon -s | wc -l`
if [ ${CHECK} -ne 0 ]
then
echo "Swap" >>${LOGFILE} 2>${ERROR}; sline
sudo swapon -s >>${LOGFILE} 2>${ERROR}; bline
fi
line; INFO="LSOF"; info; line
sudo lsof >>${LOGFILE} 2>${ERROR}
line; INFO="NET"; info; line
echo "Netstat" >>${LOGFILE} 2>${ERROR}; sline
sudo netstat -putan >>${LOGFILE} 2>${ERROR}; bline
echo "Netstat summary" >>${LOGFILE} 2>${ERROR}; sline
sudo netstat -s >>${LOGFILE} 2>${ERROR}; bline
echo "Sockets" >>${LOGFILE} 2>${ERROR}; sline
sudo ss -s>>${LOGFILE} 2>${ERROR}; bline
line; INFO="DISK"; info; line; bline
echo "Disk usage" >>${LOGFILE} 2>${ERROR}; sline
sudo df -h >>${LOGFILE} 2>${ERROR}; bline
echo "inode usage" >>${LOGFILE} 2>${ERROR}; sline
sudo df -i >>${LOGFILE} 2>${ERROR}; bline
echo "mount info" >>${LOGFILE} 2>${ERROR}; sline
sudo mount >>${LOGFILE} 2>${ERROR}; bline
echo "iostat info" >>${LOGFILE} 2>${ERROR}; sline
sudo iostat >>${LOGFILE} 2>${ERROR}
line; INFO="PARTITIONS"; info; line
echo "/proc/partitions" >>${LOGFILE} 2>${ERROR}; sline
sudo cat /proc/partitions >>${LOGFILE} 2>${ERROR}; bline
echo "fdisk" >>${LOGFILE} 2>${ERROR}; sline
sudo fdisk -l >>${LOGFILE} 2>${ERROR}; bline
sudo blkid >>${LOGFILE} 2>${ERROR}; bline
echo "fstab file" >>${LOGFILE} 2>${ERROR}; sline
sudo cat /etc/fstab >>${LOGFILE} 2>${ERROR}; bline
if [ -f /etc/mtab ]
then
echo "mtab file" >>${LOGFILE} 2>${ERROR}; sline
sudo cat /etc/mtab >>${LOGFILE} 2>${ERROR}; bline
fi
if [ -f /etc/exports ]
then
echo "export file" >>${LOGFILE} 2>${ERROR}; sline
sudo cat /etc/exports >>${LOGFILE} 2>${ERROR}; bline
fi
echo "disk device files" >>${LOGFILE} 2>${ERROR}; sline
sudo ls -la /dev/sd* /dev/xvd* >>${LOGFILE} 2>${ERROR}; bline
sudo sar >/dev/null 2>&1
if [ $? -eq 0 ]
then
line; INFO="SAR"; info; line
bline; echo "SAR CPU" >>${LOGFILE} 2>${ERROR}; sline
sudo sar >>${LOGFILE} 2>${ERROR}
bline; echo "SAR DISK" >>${LOGFILE} 2>${ERROR}; sline
sudo sar -b >>${LOGFILE} 2>${ERROR}; bline
bline; echo "SAR NETWORK" >>${LOGFILE} 2>${ERROR}; sline
sudo sar -n ALL >>${LOGFILE} 2>${ERROR}; bline
bline; echo "SAR MEMORY" >>${LOGFILE} 2>${ERROR}; sline
sudo sar -r >>${LOGFILE} 2>${ERROR}; bline
fi
line; INFO="SYSCTL"; info; line
sudo sysctl -a >>${LOGFILE} 2>${ERROR}; bline
line; INFO="NETWORKING"; info; line
sudo ifconfig -a >>${LOGFILE} 2>${ERROR}; bline
sudo netstat -i >>${LOGFILE} 2>${ERROR}; bline
bline; echo "ROUTE" >>${LOGFILE} 2>${ERROR}; sline
sudo route -n >>${LOGFILE} 2>${ERROR}; bline
sudo ip route >>${LOGFILE} 2>${ERROR}
bline; echo "ARP" >>${LOGFILE} 2>${ERROR}; sline
sudo arp -a >>${LOGFILE} 2>${ERROR}; bline
line; INFO="FIREWALL"; info; line; bline
echo "Rules:" >>${LOGFILE} 2>${ERROR}; sline
sudo iptables -L -n >>${LOGFILE} 2>${ERROR}; bline
echo "NAT Rules:" >>${LOGFILE} 2>${ERROR}; sline
sudo iptables -L -n -t nat >>${LOGFILE} 2>${ERROR}; bline
echo "Mangle Rules:" >>${LOGFILE} 2>${ERROR}; sline
sudo iptables -L -n -t mangle >>${LOGFILE} 2>${ERROR}; bline
echo "SELinux: " >>${LOGFILE} 2>${ERROR}
sudo getenforce >>${LOGFILE} 2>${ERROR}
if [ -f /selinux/enforce ]
then
echo -n "/selinux/enforce content: " >>${LOGFILE} 2>${ERROR}
sudo cat /selinux/enforce >>${LOGFILE} 2>${ERROR}
fi
line; INFO="SERVICES"; info; line
sudo chkconfig >/dev/null 2>&1
if [ $? -eq 0 ]
then
bline; echo "chkconfig" >>${LOGFILE} 2>${ERROR}; sline
sudo chkconfig >>${LOGFILE} 2>${ERROR}
bline; bline
fi
echo "Services" >>${LOGFILE} 2>${ERROR}; sline
ls /etc/init.d | while read SERVICE;do echo -n "${SERVICE}, ";done >>${LOGFILE} 2>${ERROR}; bline; bline
echo "Runlevels" >>${LOGFILE} 2>${ERROR}; sline; bline
echo -n "Default runlevel: " >>${LOGFILE} 2>${ERROR}
sudo cat /etc/inittab | grep ^id | grep initdefault | cut -d : -f 2 >>${LOGFILE} 2>${ERROR}; bline
for LEVEL in 0 1 2 3 4 5 6
do
echo -n "Level ${LEVEL} - Start: " >>${LOGFILE} 2>${ERROR}
ls /etc/rc${LEVEL}.d/S* | sed "s/\/etc\/rc${LEVEL}\.d\/S//g" | while read SERVICE;do echo -n "${SERVICE}, ";done >>${LOGFILE} 2>${ERROR}
bline
echo -n "Level ${LEVEL} - Stop: " >>${LOGFILE} 2>${ERROR}
ls /etc/rc${LEVEL}.d/K* | sed "s/\/etc\/rc${LEVEL}\.d\/K//g" | while read SERVICE;do echo -n "${SERVICE}, ";done >>${LOGFILE} 2>${ERROR}
bline; bline
done
bline; echo "/etc/rc.local file:" >>${LOGFILE} 2>${ERROR}; sline
sudo cat /etc/rc.local >>${LOGFILE} 2>${ERROR}; bline
line; INFO="CRON"; info; line
echo "$(whoami) crontab" >>${LOGFILE} 2>${ERROR}; sline
crontab -l >>${LOGFILE} 2>&1; bline
echo "root crontab" >>${LOGFILE} 2>${ERROR}; sline
sudo crontab -l >>${LOGFILE} 2>&1; bline
echo "/etc/crontab file:" >>${LOGFILE} 2>${ERROR}; sline
echo "" >>${LOGFILE} 2>${ERROR}
sudo cat /etc/crontab >>${LOGFILE} 2>${ERROR}
line; INFO="END"; info; line
echo "OK"
echo ""
echo "Next files have been generated:"
echo " ${FILENAME}"
echo " ${LOGFILE}"
echo ""
echo "Attach them to the case correspondence in order to continue with troubleshooting. Thank you!"
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment