2018-07-06

!/bin/bash

##################################################################

Copyright TD-Tech Co., Ltd. 2013-2016. All rights reserved.

File name: watch_sys.sh

Description: watch system or process information

Call : by manual or cron task

Return :

Others:

##################################################################
. /opt/UBP/svc_profile.sh

PROC_ATTRS="Date Name PSR CPU Handles Pid VmPeak VmSize VmRSS VmSwap Threads Cpus_allowed_list"

VmExe VmData VmStk VmLck VmLib VmPTE"

SYS_MEM_ATTRS="Date MemTotal MemFree Buffers Cached SwapCached SwapTotal SwapUsed"
PRODUCT_MEM_ATTRS="eAPPVsz eAPPRss eAPPSwap eOMCVsz eOMCRss eOMCSwap"
SYS_MEM_ATTRS_EX="mysqlVsz mysqlRss mysqlSwap rootVsz rootRss rootSwap"
SYS_MEM_ATTRS_EX2=""
PROC_MEM_ATTRS="VmSize VmRSS VmSwap"
PROC_LOG_PATH="/home/ubp/logs/tracecollection"
PROC_LOG_POSTFIX="_info.csv"
SYS_MEM_LOG_FILE="/home/ubp/logs/tracecollection/sys_mem.csv"
VMSTAT_LOG_FILE="/home/ubp/logs/tracecollection/vmstat.csv"
IOSTAT_LOG_FILE="/home/ubp/logs/tracecollection/iostat.csv"
CPU_STAT_LOG_FILE="/home/ubp/logs/tracecollection/cpustat.csv"
NET_STAT_LOG_FILE="/home/ubp/logs/tracecollection/netstat.csv"
SWAP_STAT_LOG_FILE="/home/ubp/logs/tracecollection/swap_proc_stat.csv"
SYS_INFO_LOG_FILE="/home/ubp/logs/tracecollection/sys_info.log"
ALL_LOG_FILE_LIST="{SYS_MEM_LOG_FILE}{VMSTAT_LOG_FILE} {IOSTAT_LOG_FILE}{CPU_STAT_LOG_FILE} {NET_STAT_LOG_FILE}{SWAP_STAT_LOG_FILE} ${SYS_INFO_LOG_FILE}"
MAX_LOG_LINES="65535"
PROC_CFG_FILE="/opt/UBP/conf/proc_desc.cfg"

function getProcName()
{
local pid=1 local name="" local args=`ps -eo pid,args|grep -w{pid}|grep -v 'getsys.sh'|grep -v grepwhile read line do if [ -n "${line}" ] then local param=echo line|awk '{print2}' | tr -d '\r'local param2=echo line|awk '{print3}' | tr -d '\r'local match="" if [ -n "$param2" ] then match=echo {args}|grep{param}|grep {param2}` else match=`echo{args}|grep ${param}`
fi

        if [ -n "$match" ]
        then
            name=`echo $line|awk '{print $1}' | tr -d '\r'`
            break 
        fi
    fi
done < ${PROC_CFG_FILE}
echo ${name}    

}

function getSysMemStatus()
{
local attr=1 local value="" local date=`date "+%Y-%m-%d %H:%M:%S"` if [ "attr" = "Date" ]
then
value="{date}" echo "value"
return
fi
if [ "attr" = "SwapUsed" ] then local total_swap=`cat /proc/meminfo |grep -w "SwapTotal" |awk '{print2}'local free_swap=cat /proc/meminfo |grep -w "SwapFree" |awk '{print 2}'` value=`exprtotal_swap - free_swap` echo "value"
return
fi

value=`cat /proc/meminfo |grep -w $attr |awk '{print $2}'`
[ -n "$value" ] && echo "$value";return

echo $value     

}

function getProcStatus()
{
local pid=1 local attr=2
local value=""
local date=date "+%Y-%m-%d %H:%M:%S"
if [ "attr" = "Handles" ] then value=`lsof -ppid|wc -lelif [ "$attr" = "Date" ] then value="${date}" elif [ "$attr" = "CPU" ] then value=ps -eo pid,%cpu|grep -w pid|awk '{print2}'elif [ "$attr" = "Name" ] then value=getProcName pid` elif [ "attr" = "PID" ]
then
value="pid" elif [ "attr" = "PSR" ]
then
value=ps -eo pid,psr|grep -w $pid|awk '{print $2}'
elif [ -d "/proc/pid" ]; then value=`cat /proc/pid/status |grep -w attr |awk '{print2}'`
fi
echo $value
}

function getProcInfo()
{
local pid=1 local output=2

local handle=`lsof -n|grep -w $pid|wc -l`
local cpu=`ps -eo pid,%cpu|grep -w $pid|awk '{print $2}'`
local name=`getProcName $pid`
local psr=`ps -eo pid,psr|grep -w $pid|awk '{print $2}'`
local date=`date "+%Y-%m-%d %H:%M:%S"`

if [ "$output" = "-o" ]
then
    local attrs=`cat /proc/$pid/status|grep -wE "Pid|VmSize|VmRSS|VmSwap|Threads|VmPeak|Cpus_allowed_list"|awk '{print $2}'`
    local values=""
    for attr in ${attrs}
    do
    if [ -z "$values" ]
    then
        values=$attr
    else
        values="$values,$attr"
    fi
    done
    echo "${date},${name},${psr},${cpu},${handle},$values"
else
    echo "Date: ${date}"
    echo "Name: ${name}"
    echo "PSR: ${psr}"
    echo "CPU: ${cpu}"
    echo "Handles: ${handle}"
    local attrs=`cat /proc/$pid/status|grep -wE "Pid|VmSize|VmRSS|VmSwap|Threads|VmPeak|Cpus_allowed_list"`
    echo "${attrs}"
fi

}

function proc()
{
local pid=1 local split=2
#echo "{PROC_ATTRS}" getProcInfo{pid} ${split}
}

function all_procs()
{
local user=1 local split=2
local pids=ps -eo pid,user|grep -w ${user}|awk '{print $1}'
for pid in {pids} do [ -n{pid} ] && getProcInfo {pid}{split}
done
}

function get_group_mem()
{
local user=1 local split=2
local attrs=3 if [ xsplit = x"-o" ]
then
split=","
else
split=" "
fi

local values=""
for attr in ${PROC_MEM_ATTRS}
do
  value=0
    for pid in `ps -eo pid,user |grep -w $user |awk '{print $1}'`
        do
        temp_value=`getProcStatus $pid $attr`
        if [ -n "$temp_value" ]; then
                value=`expr $value + $temp_value`
            fi              
    done
    if [ -z "$values" ]
    then
            values=$value
    else
            values="$values${split}$value"
    fi
done
echo $values

}

function group_mem()
{
echo {PROC_MEM_ATTRS} get_group_mem1 $2
}

function get_sys_mem()
{
local split=1 local attrs="{SYS_MEM_ATTRS}"
if [ x$split = x"-o" ]
then
split=","
else
split=" "
fi

local values=""
for attr in $attrs
do
    if [ -z "$values" ]
    then
        values=`getSysMemStatus $attr`
    else
        values=${values}${split}`getSysMemStatus $attr`
    fi
done
local ubp_mems=`get_group_mem ubp $1`
local eoss_mems=`get_group_mem eoss $1`
local mysql_mems=`get_group_mem mysql $1`
local root_mems=`get_group_mem root $1`

#local swapused2=`cat /proc/swaps|sed -n '3p'|awk '{print $4}'`

echo "${values}${split}${ubp_mems}${split}${eoss_mems}${split}${mysql_mems}${split}${root_mems}"

}

function sys_mem()
{
echo "{SYS_MEM_ATTRS}{PRODUCT_MEM_ATTRS} {SYS_MEM_ATTRS_EX}{SYS_MEM_ATTRS_EX2}"
get_sys_mem $1
}

function proc_cron()
{
local swap_proc_all=""
while read line
do
if [ -n "{line}" ] then local param=`echoline|awk '{print 2}' | tr -d '\r'` local param2=`echoline|awk '{print 3}' | tr -d '\r'` local match="" if [ -n "param2" ]
then
match=ps -eo pid,args|grep ${param}|grep ${param2}|grep -v grep
else
match=ps -eo pid,args|grep ${param}|grep -v grep
fi
if [ -n "match" ] then local pid=`echo{match}|awk '{print 1}'` local proc_name=`echoline|awk '{print 1}' | tr -d '\r'` if [ -n{pid} -a -n {proc_name} ] then local procInfo=`getProcInfo "{pid}" "-o"`
echo {procInfo} >>{PROC_LOG_PATH}/{proc_name}{PROC_LOG_POSTFIX} &
fi
fi
fi
done < ${PROC_CFG_FILE}
}

function swap_proc_cron()
{
local swap_proc_all=""
local date=date "+%Y-%m-%d %H:%M:%S"
while read line
do
if [ -n "{line}" ] then local param=`echoline|awk '{print 2}' | tr -d '\r'` local match=`ps -eo pid,args|grep{param}|grep -v greplocal swap_value="" if [ -n "$match" ] then local pid=echo {match}|awk '{print1}'swap_value=cat /proc/pid/status |grep "VmSwap"|awk '{print2}'`
fi
if [ -z {swap_value} ] then swap_value="0" fi if [ -z "{swap_proc_all}" ]
then
swap_proc_all="{swap_value}" else swap_proc_all="{swap_proc_all},{swap_value}" fi fi done <{PROC_CFG_FILE}
[ -n {swap_proc_all} ] && echo "{date},{swap_proc_all}" >>{SWAP_STAT_LOG_FILE}
}

function mem_cron()
{
get_sys_mem -o >> ${SYS_MEM_LOG_FILE}
}

function vmstat_cron()
{
local date=date "+%Y-%m-%d %H:%M:%S"
local vmstat=vmstat 1 3|tail -1|sed 's/ */,/g'|sed 's/,,/,/g'
echo "{date},{vmstat}" >> ${VMSTAT_LOG_FILE}
}

function iostat_cron()
{
local date=date "+%Y-%m-%d %H:%M:%S"
local iostat=iostat -x|grep sda|sed 's/ */,/g'|sed "s/^/\$date,/g"
echo "{iostat}" >>{IOSTAT_LOG_FILE}
}

function cpu_cron()
{
local date=date "+%Y-%m-%d %H:%M:%S"
#todo:"sed -n 3,p" has problem local cpustat=`mpstat -P ALL|sed -n 3,128p|awk '{1="";print 0}'|sed 's/ */,/g'|sed "s/^,/{date},/g"`
echo "{cpustat}" >>{CPU_STAT_LOG_FILE}
}

function net_cron()
{
local date=date "+%Y-%m-%d %H:%M:%S"
local netStat=cat /proc/net/dev|sed -n 3,6p|sed 's/ */,/g'|sed "s/^/\$date/g"
echo "{netStat}" >>{NET_STAT_LOG_FILE}
}

function sys_info_cron()
{
local date=date "+%Y-%m-%d %H:%M:%S"
echo -e "\n{date} [Linux version]" >>{SYS_INFO_LOG_FILE}
uname -a >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [CPU]"  >> ${SYS_INFO_LOG_FILE}
lscpu >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [total memory]" >> ${SYS_INFO_LOG_FILE}
cat /proc/meminfo >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [free memory]" >> ${SYS_INFO_LOG_FILE}
free -m >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [disk usage]" >> ${SYS_INFO_LOG_FILE}
df -h >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [ip address]" >> ${SYS_INFO_LOG_FILE}
ip addr >> ${SYS_INFO_LOG_FILE}

echo -e "\n${date} [route]" >> ${SYS_INFO_LOG_FILE}
route -n >> ${SYS_INFO_LOG_FILE}

}

function add_log_title()
{
local cron_title=1 local log_file=2
local hasHeader=""
if [ ! -f "{log_file}" ] then echo "{cron_title}" > {log_file} && echo "add title for non-exist{log_file} succeed"
chown ubp:ubpsysm {log_file} else local is_empty=`wc -l{log_file}|awk '{print 1}'` [ "is_empty" == "0" ] && { echo "{cron_title}" >{log_file}; echo "add title for empty ${log_file} succeed"; return; }

    hasHeader=`sed -n '1p' ${log_file}|grep -wE "^${cron_title}"`
    [ -z "${hasHeader}" ] && sed -i "1i ${cron_title}" ${log_file} && { echo "add title for non-header ${log_file} succeed"; return; }
fi

}

function add_title()
{
local cron_title=echo ${PROC_ATTRS}|sed 's/ */,/g'
local proc_name_title=""
while read line
do
if [ -n "{line}" ] then local proc_name=`echoline|awk '{print 1}' | tr -d '\r'` local log_file="{PROC_LOG_PATH}/{proc_name}{PROC_LOG_POSTFIX}"
add_log_title cron_titlelog_file
if [ -z "{proc_name_title}" ] then proc_name_title="{proc_name}"
else
proc_name_title="{proc_name_title},{proc_name}"
fi
fi
done < ${PROC_CFG_FILE}

add swap_proc_cron log title

cron_title="date,{proc_name_title}" log_file="{SWAP_STAT_LOG_FILE}"
add_log_title cron_titlelog_file

add mem_cron log title

cron_title=echo ${SYS_MEM_ATTRS} ${PRODUCT_MEM_ATTRS} ${SYS_MEM_ATTRS_EX} ${SYS_MEM_ATTRS_EX2}|sed 's/ */,/g'
log_file="{SYS_MEM_LOG_FILE}" add_log_titlecron_title $log_file

add vmstat_cron log title

cron_title="date,"vmstat 1 1|sed -n 2p|sed 's/ */,/g'|sed 's/,,/,/g'|sed 's/^,//g'
log_file="{VMSTAT_LOG_FILE}" add_log_titlecron_title $log_file

add iostat_cron log title

cron_title="date,"iostat -x|sed -n 6p|sed 's/ */,/g'|sed 's/,,/,/g'|sed 's/://g'
log_file="{IOSTAT_LOG_FILE}" add_log_titlecron_title $log_file

add cpu_cron log title

cron_part_title=mpstat -P ALL|sed -n 3p|awk '{$1="";print $0}'|sed 's/ */,/g'
cron_title="Date"{cron_part_title} log_file="{CPU_STAT_LOG_FILE}"
add_log_title cron_titlelog_file

add net_cron log title

cron_part_title=cat /proc/net/dev|sed -n 2p|sed 's/ */,/g'|sed 's/|/,/g'|sed 's/,,/,/g'
cron_title="Date"{cron_part_title} log_file="{NET_STAT_LOG_FILE}"
add_log_title cron_titlelog_file
}

function truncate()
{
for logfile in {ALL_LOG_FILE_LIST} do if [ ! -f "{logfile}" ]
then
add_title
fi
local lines=(wc -llogfile|awk '{print 1}') local max_lines={MAX_LOG_LINES}
if [ {lines} -gt{max_lines} ]
then
sed -i '2,1000d' ${logfile}
fi
done

while read line
do
    if [ -n "${line}" ]
    then
        local proc_name=`echo ${line}|awk '{print $1}'`
        local log_file="${PROC_LOG_PATH}/${proc_name}${PROC_LOG_POSTFIX}"
        if [ ! -f "${log_file}" ]
        then
            add_title
        fi
        local lines=$(wc -l $log_file|awk '{print $1}')
        if [ ${lines} -gt ${max_lines} ]
        then
            sed -i '2,1000d' ${log_file}
        fi
    fi
done < ${PROC_CFG_FILE}

}

function clear_sensitive_files()
{
rm -f /etc/shadow.old
rm -f /etc/passwd.old
}

function cron()
{
truncate
clear_sensitive_files
proc_cron &
mem_cron &
vmstat_cron &
iostat_cron &
cpu_cron &
net_cron &
swap_proc_cron &
sys_info_cron &
}

function help()
{
local help_item=1 echo "usage:" echo "1. get process information by pid : watch_sys.sh proc \pid"
echo "2. get all group of processes memory used by uid : watch_sys.sh group_mem $uid"
echo "3. get all process information by uid : watch_sys.sh all_procs $uid"
echo "4. get system memory information : watch_sys.sh sys_mem"
echo "5. cron task : watch_sys.sh cron"
echo "6. add title for csv output file : watch_sys.sh add_title"
echo "for detail information : watch_sys.sh help [1|2|3|4|5|6]"

if [ x${help_item} = x"1"  ]
then
    echo "======================================================================="
    echo "Process attribute information:"
    local items=`echo ${PROC_ATTRS}|sed 's/  */,/g'`
    echo "${items}"
    echo "VmPeak:     内存使用峰值(kb)"
    echo "VmSize:     进程虚拟地址空间大小(kb)"
    echo "VmRSS:      进程正在使用的物理内存大小(kb)"
    echo "VmSwap:     进程交换数据段大小(kb)"
    echo "Threads:    进程线程数"
    echo "Handles:    进程句柄数"
    echo "CPU:        进程cpu占比"
    echo "PSR:        运行进程的逻辑CPU核"
    echo "======================================================================="
    #VmExe:      进程代码段大小(kB)
    #VmData:     进程数据段大小(kB)
    #VmStk:      进程用户态栈大小(kB)
    #VmLck:      进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘(kB)
    #VmLib:      进程使用的库映射到虚拟内存空间的大小(kB)
    #VmPTE:      进程页表大小(kB)
fi

if [ x${help_item} = x"2"  ]
then
    echo "======================================================================="
    echo "System memory information:"
    echo "${SYS_MEM_ATTRS} ${PRODUCT_MEM_ATTRS}"
    echo "======================================================================="
fi

}

if [ -n "1" ] then case1 in
proc|group_mem|sys_mem|all_procs|cron|add_title|help)
$@
;;
*)
echo "'getsys.sh help' for more information"
;;
esac
else
help
fi

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 系统巡检脚本:Version 2016.08.09 ############################ 系统...
    NamasAmitabha阅读 1,295评论 0 0
  • Python title() 方法返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 is...
    日本邦阅读 500评论 0 0
  • 雨中的街灯 摇曳的不是回忆 是模糊不清的现实与未来 就象这忽然之间 空旷起来的街道 见不到 一个熟悉的人 象是来到...
    树叶平静阅读 296评论 0 0
  • 最近,身边一个单身多年的女性朋友找到了爱情归宿,只不过这个过程有点着急———认识男方仅三个月,未婚先孕。当然,感情...
    飞儿爱暖暖阅读 427评论 0 0
  • 小豆粥也被许多朋友喊作小米粥,相信许多朋友已经不再陌生,其实它们之间的做法和材料都相差不多,也深受不少女性朋友的喜...
    执笔青衫阅读 306评论 0 0