60天shell脚本计划-5/12-渐入佳境
--作者:飞翔的小胖猪
--创建时间:2021年2月16日
--修改时间:2021年2月20日
说明
每日上传更新一个shell脚本,周期为60天。如有需求的读者可根据自己实际情况选用合适的脚本,也可在评论区留言提出脚本需求,作者会尽快根据需求编写相关脚本对功能进行实现。
每篇文章包含5个脚本。
总进度:5/12
上一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14399775.html
下一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14415847.html
主要内容
21年2月16日-mysql连接脚本
************************************************************************************************************************************************************************************************************************************
脚本说明
mysql连接脚本,在脚本中键入指定的sql执行。好像没有实质性的用处。
文件说明
Mysql_driver.sh:脚本主体文件
脚本主体
[root@135 21_Mysql_driver]# cat Mysql_driver.sh
#!/bin/bash
#定义变量数据相关参数,其他的函数需要使用时直接从这里获取。
connect_db(){
IP=${IP:-127.0.0.1}
PORT=${PORT:-3306}
USERNAME=${USERNAME:-test21}
PASSWORD=${PASSWORD:-123456}
DBNAME=${DBNAME:-test_db}
echo -e "DB connection parameters>> \n HOSTNAME: $IP \n PORT: $PORT \n USERNAME: $USERNAME \n PASSWORD: $PASSWORD \n DB_NAME: $DBNAME"
} #测试数据库是否能够连接。
test_connection_status(){
mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"show tables;" &>/dev/null
return $?
} #执行语句函数
edit_data(){
sql_language=${1:- }
echo "sql执行语言为:$sql_language "
mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"${sql_language};"
if [ $? -eq 0 ];then
echo "Command executed successfully。"
else
echo "Command execution failed!"
fi
} #主函数
main(){
#输入数据连接参数
IP="127.0.0.1"
PORT="3306"
USERNAME="test21"
PASSWORD="123456"
DBNAME="test_db" #需要执行的sql语句,通过执行时传入,如果为传入则查看所有的表名
sql_l='select * from t1;' connect_db
test_connection_status
sql_l_f=`echo "${sql_l} commit;"` if test_connection_status;then
echo "数据库连接成功,可以执行命令。"
edit_data "${sql_l_f}"
else
echo -e "数据库连接失败!!!\nCase:\n 1.请检查连接参数是否正确。\n 2.数据库连接设置是否正确。"
fi
} main
结果
**************************************************************************************************************2021年2月16日脚本结束*****************************************************************************************************************
21年2月17日-显示love脚本
************************************************************************************************************************************************************************************************************************************
脚本说明
循环显示 i love字母。
文件说明
display_love.sh:脚本主体文件
脚本主体
[root@135 22_i_love_you]# cat display_love.sh
#!/bin/bash
trap 'onCtrlC' INT
# 显示LOVE
love1(){
echo ""
echo " #### "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " #### "
} love2(){
echo ""
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "#########"
echo "######## "
} love3(){
echo ""
echo " ###### "
echo " ######## "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ######## "
echo " ###### "
} love4(){
echo ""
echo "## ##"
echo "## ##"
echo "## ##"
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ### "
echo " # "
} love5(){
echo ""
echo " #############"
echo " ############"
echo " ##"
echo " ##"
echo " ###########"
echo " ###########"
echo " ##"
echo " ##"
echo " ###########"
echo " #############"
} display_love(){
clear
while :
do
for i in {1..5}
do
love${i}
love${i} > love${i}
sleep 0.5
clear
done
sleep 0.7
paste love1 love2 love3 love4 love5
sleep 2
rm -rf love1 love2 love3 love4 love5
clear
done
} #捕获ctrl+c执行删除临时文件。
onCtrlC(){
rm -rf love1 love2 love3 love4 love5 &>/dev/null
exit 99
} display_love
结果
**************************************************************************************************************2021年2月17日脚本结束*****************************************************************************************************************
21年2月18日-echo显示hello word
************************************************************************************************************************************************************************************************************************************
脚本说明
使用echo的定位符来回显示“hello,word!”这句话。
文件说明
advanced_echo.sh:脚本主体文件
脚本主体
[root@135 23_advanced_echo]# cat advanced_echo.sh
#!/bin/bash
clear
hello=("H" "e" "l" "l" "o" "," "W" "o" "r" "d" "!")
arr_len=${#hello[*]}
while :
do
for((i=0;i<$arr_len;i++))
do
let j=$i+3
echo -e "\033[5;${j}H${hello[i]}"
sleep 0.2
done
clear
for((i=$arr_len;i>=0;i--))
do
let j=$i+3
echo -e "\033[5;${j}H${hello[i]}"
sleep 0.2
done
clear
done
结果
**************************************************************************************************************2021年2月18日脚本结束*****************************************************************************************************************
21年2月19日-系统网络接口流量脚本
************************************************************************************************************************************************************************************************************************************
脚本说明
脚本提取/proc/net/dev文件内容计算出系统中网卡流量信息,接口数据流量大小,错误包个数等。
文件说明
net_info.sh:脚本主体文件
脚本主体
[root@135 24_net_info]# cat net_info.sh
#!/bin/bash
#网络流量信息
#通过两次读取/proc/net/dev文件,间隔一秒,导出1秒的网卡流量数据。
net_info(){
echo -e "-------------Net------------\n" #获取网口名
net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'` #截取两个数据间隔时间为1秒
net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
#设置文件提取信息间隔为1秒
sleep 1
net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev` echo -e "New: \n$net_info_new\n"
echo -e "Old: \n$net_info_old\n" echo "$net_dict"| while read dev_name
do
rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'` tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'` rx=$((${rx_new}-${rx_old}))
rx_p=$((${rx_new_p}-${rx_old_p}))
rx_e=$((${rx_old_e}-${rx_new_e})) tx=$((${tx_new}-${tx_old}))
tx_p=$((${tx_new_p}-${tx_old_p}))
tx_e=$((${tx_old_e}-${tx_new_e})) #echo "$rx"
#echo "$rx_p"
echo -e "Net_name: $dev_name"
echo -e " 收流量/B: $rx\n 收包数/个: $rx_p\n 收错误包/个: $rx_e\n 发流量/B: $tx\n 发包数/个: $tx_p\n 发包错误数/个: $tx_e\n" done } main(){
net_info
} main
结果
**************************************************************************************************************2021年2月19日脚本结束*****************************************************************************************************************
21年2月20日-系统监控脚本(详细版)
************************************************************************************************************************************************************************************************************************************
脚本说明
脚本通过8个函数获取当前操作系统的性能数据,包括cpu、内存、磁盘io、网络流量、进程信息、端口及打开文件限制、系统基本信息、文件md5值比对。
脚本只对使用比较广泛的数据进行采集,如果需要更详细的数据各位看官可在对应的函数中进行代码增减。
文件说明
performance_info.sh:脚本主体文件
脚本主体
[root@135 25_cpu_info]# cat performance_info.sh
#!/bin/bash
#cpu信息
cpu_info(){
Cpu_Num=`nproc` #获取逻辑CPU的个数
Avage_five_cpu=`uptime | sed 's/.*load average: //g' | sed 's#\,##g'|awk '{print $2}'` #采集5分钟CPU负载情况
let Used_rate_cpu=100-`vmstat 1 2 |awk '{if(NR>3){printf $(NF-2) }}'` #cpu使用率
CPU_queue_depth=`vmstat 1 2 |awk '{if(NR>3){printf $1}}'` #cpu队列深度 #cpu信息总输出
echo -e "-------------CPU------------\n"
echo -e "Cpu_num: ${Cpu_Num:-null}\nCpu five avage: ${Avage_five_cpu:-null}\nCPU_rate: ${Used_rate_cpu:-null}\nCPU_queue: ${CPU_queue_depth:-null}\n"
} #内存信息
mem_info(){
all_mem_info=`awk '/^MemTotal|^MemFree|^SwapTotal|^SwapFree|^Buffers|^Cached/{print}' /proc/meminfo` total_mem=`echo "$all_mem_info"|awk '/MemTotal/{printf ("%d\n",$2/1024)}'`
free_mem=`echo "$all_mem_info"|awk '/MemFree/{printf ("%d\n",$2/1024)}'`
total_swap=`echo "$all_mem_info"|awk '/SwapTotal/{printf ("%d\n",$2/1024)}'`
free_swap=`echo "$all_mem_info"|awk '/SwapFree/{printf ("%d\n",$2/1024)}'`
buffer=`echo "$all_mem_info"|awk '/Buffers/{printf ("%d\n",$2/1024)}'`
cached=`echo "$all_mem_info"|awk '/Cached/{printf ("%d\n",$2/1024)}'`
swappiness=`cat /proc/sys/vm/swappiness ` #内存信息总输出
echo -e "-------------Mem------------\n"
echo -e "Swappiness: ${swappiness:-null}"
echo -e "Total_Mem: ${total_mem:-null}MB\nFree_mem: ${free_mem:-null}MB\nTotal_swap: ${total_swap:-null}MB\nFree_mem: ${free_swap:-null}MB\nBuffers: ${buffer:-null}MB\nCached: ${cached:-null}MB\n"
} #磁盘IO信息
io_info(){
#不适用于rhel8以上的版本
disk_num=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'|wc -l`
io_info=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'` #echo "$io_info" |while read dev_name r_s w_s rkB_s wkB_s rrqm_s wrqm_s rrqm wrqm r_await w_await aqu_sz rareq_sz wareq_sz svctm util
echo -e "-------------I/O------------\n"
echo "$io_info" |while read dev_name line
do
echo -e "Dev_name: $dev_name"
iops=`echo "$line" | awk '{printf ("%f\n",$1+$2)}'`
rbps=`echo "$line" | awk '{printf ("%f\n",$3/1024)}'`
wbps=`echo "$line" | awk '{printf ("%f\n",$4/1024)}'`
rwbps=`echo "$line" | awk '{printf ("%f\n",($3+$4)/1024)}'`
util=`echo "$line" | awk '{printf ("%f\n",$NF)}'` #磁盘信息总输出
echo -e " iops: $iops\n r/bps: $rbps\n r/bps: $wbps\n 吞吐量: $rwbps\n 响应时间: ${util}\n"
done
} #网络流量信息
net_info(){
echo -e "-------------Net------------\n" #获取网口名
net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'` #截取两个数据间隔时间为1秒
net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
sleep 2
net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev` echo -e "New: \n$net_info_new"
echo -e "Old: \n$net_info_old" echo "$net_dict"| while read dev_name
do
rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'` tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'` rx=$((${rx_new}-${rx_old}))
rx_p=$((${rx_new_p}-${rx_old_p}))
rx_e=$((${rx_old_e}-${rx_new_e})) tx=$((${tx_new}-${tx_old}))
tx_p=$((${tx_new_p}-${tx_old_p}))
tx_e=$((${tx_old_e}-${tx_new_e})) #echo "$rx"
#echo "$rx_p"
echo -e "Net_name: $dev_name"
echo -e " RX: $rx\n RX_P: $rx_p\n RX_E: $rx_e\n TX: $tx\n TX_P: $tx_p\n TX_E: $tx_e\n"
done
} #进程信息
process_info(){
echo -e "----------------------------------------------Process---------------------------------------------\n"
top_head=`ps aux|head -1` #cpu占用top5
top_cpu=`ps aux|grep -v PID|sort -rn -k +3|head` #内存占用top5
top_mem=`ps aux|grep -v PID|sort -rn -k +4|head` #业务进程传参
yw_p_name="sshd"
yw_p_num=`ps -ef | grep -i ${yw_p_name:- } | grep -v grep|wc -l` #僵尸进程
zombie_num=`ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'|wc -l` #打开进程数
process_num=`ps -aux | wc -l` #最大允许进程数
limit_total_p_n=`ulimit -u` #程序相关总输出
echo -e "$yw_p_name进程数量: ${yw_p_num:-null}\n僵尸进程数量: ${zombie_num:-null}\n运行进程数量: $((${process_num:-null}-1))\n当前用户允许进程数: ${limit_total_p_n:-null}\n"
echo -e "$top_head\nCpu---------------\n$top_cpu\n\nMem------------------\n$top_mem\n" } #端口及文件
port_file_limit(){
echo -e "-------------Port && File------------\n"
#端口数分别统计ipv4和ipv6
port_4_n=`netstat -alntup | grep -v -E '^tcp6|^udp6' |egrep -i '^tcp|^udp|^TCP|^UDP'| wc -l`
port_6_n=`netstat -alntup | grep -E '^tcp6|^udp6' | wc -l` #监听端口
list_port_n=`netstat -ntlpu | egrep -i '^tcp|^udp|^TCP|^UDP'|wc -l` #总端口数
total_n=`netstat -alntup| egrep -i '^tcp|^udp|^TCP|^UDP'|wc -l` #打开文件总数
open_f_num=`lsof | wc -l` #允许打开文件数
limit_total_f_n=`cat /proc/sys/fs/file-max` echo -e "ipv4端口: ${port_4_n:-null}\nipv6端口: ${port_6_n:-null} \n监听端口: ${list_port_n:-null}\n总打开端口数: ${total_n:-null}\n允许最大端口数: 65535\n打开文件总数: ${open_f_num:-null}\n允许打开文件数: ${limit_total_f_n:-null}"
} #系统及基本信息
system_info(){
if cat /proc/version|grep -i centos &>/dev/null;then
system_version='Centos'
elif cat /proc/version|grep -i redhat &>/dev/null;then
system_version='Red hat'
elif cat /proc/version|grep -i debian &>/dev/null;then
system_version='Debian'
elif cat /proc/version|grep -i Ubuntu &>/dev/null;then
system_version='Ubuntu'
elif cat /proc/version|grep -i suse &>/dev/null;then
system_version='Suse'
else
echo "This system Manufacturer : unknown"
fi machine_name=`hostname`
line_n=`w |awk 'NR>2{print $1}'|wc -l `
login_user=`w |awk 'NR>2{print $1}' |sort -r -n |uniq`
ip_address=`ip a|grep -i -A2 'MULTICAST,UP,LOWER_UP' | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" |grep -E -v "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.255" | head -1 `
System_start_time=`uptime | awk '{print $1}'` #得开机时间
System_uptime=`uptime |awk -F ',' '{print $1}' |sed 's#.*up##g'` #得到运行时常 #系统信息总输出
echo -e "-------------System------------\n"
echo -e "开机时间: ${System_start_time:-null}"
echo -e "运行时间: ${System_uptime:-null}"
echo -e "系统厂商: ${system_version:-null}\n主 机 名: ${machine_name:-null}\nIp 地 址: ${ip_address:-null}\n登录用户: ${login_user:-$USER}\n在线用户数: ${line_n:-null}\n"
} #检测关键文件md5值
Check_file_md5(){
echo -e "-------------File_sum------------\n时间: `date`\n"
#读取文件路径生成MD5保存到临时文件中
first_ctl=0
for file_name in /etc/passwd /etc/group /etc/shadow
do
if [ -f .history_sum.txt ];then
#如果first_ctl变量为1表示为第一次获取md5值
if [ ${first_ctl} -eq 1 ];then
md5sum $file_name >> .history_sum.txt
fi #对比md5值
new_sum=`md5sum $file_name|awk '{printf $1}'`
old_sum=`cat .history_sum.txt |grep ${file_name}|awk '{printf $1}'`
if [ "${new_sum}" == "${old_sum}" ];then
#echo "`date` Check ${file_name} not changed." >> /var/log/message
echo "Check ${file_name} not changed."
else
#echo "`date` Check ${file_name} changed!!!" >> /var/log/message
echo "Check ${file_name} changed!!!"
fi else
#地没有历史文件,创建一个并且把控制变量置1
first_ctl=1
md5sum $file_name >> .history_sum.txt
#echo "`date` Check ${file_name} not changed." >> /var/log/message
echo "Check ${file_name} not changed."
fi
done
echo ""
} main(){
cpu_info
mem_info
io_info
net_info
process_info
port_file_limit
system_info
Check_file_md5
} main
结果
**************************************************************************************************************2021年2月20日脚本结束*****************************************************************************************************************
60天shell脚本计划-5/12-渐入佳境的更多相关文章
- 60天shell脚本计划-12/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月23日 --修改时间:2021年3月27日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 60天shell脚本计划-8/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月3日 --修改时间:2021年3月7日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在评 ...
- 60天shell脚本计划-11/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月18日 --修改时间:2021年3月22日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 60天shell脚本计划-10/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月13日 --修改时间:2021年3月17日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 60天shell脚本计划-9/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月8日 --修改时间:2021年3月12日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...
- 60天shell脚本计划-7/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月26日 --修改时间:2021年3月2日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...
- 60天shell脚本计划-6/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月21日 --修改时间:2021年2月25日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 60天shell脚本计划-4/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月11日 --修改时间:2021年2月15日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 60天shell脚本计划-3/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月6日 --修改时间:2021年2月10日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...
随机推荐
- CSS基本语法(二)
目录 CSS基本语法(二) 八.CSS复合选择器 1.后代选择器** 2.子选择器 3.并集选择器** 4.伪类选择器 链接伪类选择器 :focus伪类选择器 总结 九.CSS的元素显示样式 1.概念 ...
- 元编程 (meta-programming)
元编程 (meta-programming) 术语 meta:英语前缀词根,来源于希腊文.中国大陆一般翻译成"元". 在逻辑学中,可以理解为:关于X的更高层次,同时,这个更高层次的 ...
- Lesson5——Pandas Panel三维数据结构
pandas目录 1 简介 自 Pandas 0.25 版本后, Panel 结构已经被废弃. pd.__version__ #查看pandas版本 #'1.2.4' #或者 pd.show_vers ...
- 支付宝同步请求检查appid,以及公钥,私钥是否正确
第一步:下载支付宝Demo 下载地址:https://opendocs.alipay.com/open/270/106291#%E8%BF%90%E8%A1%8C%E8%AF%B4%E6%98%8E ...
- GC基础知识
内存溢出和内存泄漏 内存溢出(Out Of Memory) 就是申请内存时,JVM没有足够的内存空间.通俗说法就是去蹲坑发现坑位满了. 内存泄露 (Memory Leak) 就是申请了内存,但是没有释 ...
- ApacheJemeter的简单使用
前言:最近由于工作需要进行接口测试,故简单复习一下ApacheJemeter的使用 安装包下载地址: 链接:https://pan.baidu.com/s/11ywNWRUkFNNBCWw4HiO6B ...
- Java线程池实现原理及其在美团业务中的实践(转)
转自美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 随着计算机行业的飞速发展,摩尔定律逐 ...
- Spring学习六:自定义Event事件
Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为 SpringExample 的 ...
- Handler消息机制的写法
使用Handler的步骤: 1.主线程中创建一个Handler private Handler handler = new Handler(){ ...
- 前端开发Grunt工具的安装使用
随着前端开发效果越来越丰富,前端的结构也越来越复杂,这个时候就需要一个工具来进行管理,可以帮你做语法校验,文件拼接,代码压缩,文件清理等等琐事,Grunt就是这么一个不错的工具. 安装并不复杂,只要先 ...