下面的脚本可以一次性获取嵌入式Linux系统上有用的系统信息,包括网络信息,存储信息,环境信息等等。
它同时支持周期性运行,可以用于系统监测,比如检查内存泄露等。
注:由于我用的busybox中的top不支持-n 选项,因此使用了后台运行,一定时间后再杀死top进程的办法。
top 命令如果支持-n 选项就非常简单了。
使用方法:
$ sysinfo.sh -h
usage: sysinfo.sh [options]
show system information.
Without option, it will show all information.
options:
-c <count> : show how many times.
-d: show disk information.
-e: show environment.
-g: show general information.
-i <interval>: show information every <interval> seconds.
-m: show memory information.
-n: show network information.
-p: show process information.
-r: show release information.
-h: show help
#!/bin/sh
trap my_exit SIGINT
#---------------------------- variables --------------------------------------------------
PROG_NAME=`basename $0`
SHOW_GENERAL=0
SHOW_DISK=0
SHOW_ENV=0
SHOW_MEM=0
SHOW_NET=0
SHOW_PROC=0
INTERVAL=-1
ALWAYS_LOOP=0
COUNT=-1
INDEX=1
NOT_SHOW_ALL=0
#---------------------------- functions --------------------------------------------------
my_exit()
{
killall top 2>/dev/null
exit 0
}
run_cmd()
{
echo $ $*
eval $*
echo
}
usage() {
cat << END
usage: $PROG_NAME [options]
show system information.
Without option, it will show all information.
options:
-c <count> : show how many times.
-d: show disk information.
-e: show environment.
-g: show general information.
-i <interval>: show information every <interval> seconds.
-m: show memory information.
-n: show network information.
-p: show process information.
-h: show help
END
}
set_show_all()
{
SHOW_GENERAL=1
SHOW_DISK=1
SHOW_ENV=1
SHOW_MEM=1
SHOW_NET=1
SHOW_PROC=1
}
show_general()
{
echo "++++++++++++++++++++++++++ General +++++++++++++++++++++++++++++++++"
run_cmd cat /proc/version
run_cmd cat /proc/uptime
run_cmd cat /proc/cmdline
run_cmd hostname
run_cmd cat /proc/modules
}
show_disk()
{
echo "++++++++++++++++++++++++++ Disk ++++++++++++++++++++++++++++++++++++"
run_cmd cat /proc/mounts
run_cmd cat /proc/mtd
run_cmd df
}
show_env()
{
echo "++++++++++++++++++++++++++ Env +++++++++++++++++++++++++++++++++++++"
run_cmd env
}
show_mem()
{
echo "++++++++++++++++++++++++++ MEM +++++++++++++++++++++++++++++++++++++"
run_cmd cat /proc/vmstat
run_cmd cat /proc/meminfo
run_cmd top &
sleep 2
killall top
}
show_proc()
{
echo "++++++++++++++++++++++++++ Process +++++++++++++++++++++++++++++++++"
run_cmd ps w
}
show_net()
{
echo "++++++++++++++++++++++++++ Network +++++++++++++++++++++++++++++++++"
run_cmd ifconfig
run_cmd route -n
run_cmd cat /etc/resolv.conf
}
show_info()
{
[ $SHOW_GENERAL -eq 0 ] || show_general
[ $SHOW_DISK -eq 0 ] || show_disk
[ $SHOW_ENV -eq 0 ] || show_env
[ $SHOW_MEM -eq 0 ] || show_mem
[ $SHOW_NET -eq 0 ] || show_net
[ $SHOW_PROC -eq 0 ] || show_proc
}
#---------------------------- main() --------------------------------------------------
# get command line arguments
while getopts "c:degi:mnph" options; do
case "$options" in
c) COUNT=$OPTARG ;;
d) SHOW_DISK=1;NOT_SHOW_ALL=1 ;;
e) SHOW_ENV=1;NOT_SHOW_ALL=1 ;;
g) SHOW_GENERAL=1;NOT_SHOW_ALL=1 ;;
i) INTERVAL=$OPTARG ;;
m) SHOW_MEM=1;NOT_SHOW_ALL=1 ;;
n) SHOW_NET=1;NOT_SHOW_ALL=1 ;;
p) SHOW_PROC=1;NOT_SHOW_ALL=1 ;;
h) usage; exit 0;;
\?) usage; exit -1;;
esac
done
shift $((OPTIND - 1))
#if set interval and not set count, loop forever
if [ $INTERVAL -lt 0 ]; then
INTERVAL=1
else
if [ $COUNT -lt 0 ]; then
ALWAYS_LOOP=1
fi
fi
if [ $COUNT -lt 0 ]; then
COUNT=1
fi
if [ $NOT_SHOW_ALL -eq 0 ]; then
set_show_all
fi
while [ $ALWAYS_LOOP -eq 1 ] || [ $COUNT -gt 0 ]; do
echo "============================= SYS INFO ============================="
echo "#$INDEX Date: `date +%Y-%m-%d_%H:%M:%S`"
show_info
echo "============================= SYS INFO END ========================="
INDEX=$((INDEX + 1))
COUNT=$((COUNT - 1))
sleep $INTERVAL
done