Last active
October 7, 2015 14:28
-
-
Save jsianes/69c416a2d6b813d72068 to your computer and use it in GitHub Desktop.
Shell script to obtain useful information about a Linux instance for troubleshooting
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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