本篇文章给大家谈谈s命令m做的100件事,以及执行sed命令卡死CPU消耗100对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
MySQL服务器安装MHA,sed命令修改安装脚本时卡死:
[root@TJ-DB-6CU552YPXSbackup]#sed-i"s/.*vip.*pingvalid.*/#&/g"mha_install.shn^Cn[root@TJ-DB-6CU552YPXSbackup]#n
top查看,sed进程CPU使用率100%:
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMANDn14343root200104m1020852R100.00.00:13.94sedn分析
pstack打印进程堆栈信息:
[root@TJ-DB-6CU552YPXS~]#pstack14343n#00x00007f123d474e46ingconv()from/usr/lib64/gconv/GBK.son#10x0000003f8368c6abinmbrtowc()from/lib64/libc.so.6n#20x00000000004052edin??()n#30x0000000000405373in??()n#40x0000000000406323in??()n#50x0000000000407875in??()n#60x00000000004026e4in??()n#70x0000003f8361f0bdin__libc_start_main()from/lib64/libc.so.6n#80x0000000000402029in??()n#90x00007ffcde547f38in??()n#100x000000000000001cin??()n#110x0000000000000004in??()n#120x00007ffcde5498d0in??()n#130x00007ffcde5498d4in??()n#140x00007ffcde5498d7in??()n#150x00007ffcde5498dain??()n#160x0000000000000000in??()n
sed卡在字符集转换gconv()函数上,mha_install.sh文件字符集为uft-8,os当前session字符集为gbk:
[root@TJ-DB-6CU552YPXSbackup]#file-imha_install.shnmha_install.sh:text/x-shellscript;charset=utf-8n[root@TJ-DB-6CU552YPXSbackup]#localenLANG=zh_CN.gbknLC_CTYPE="zh_CN.gbk"nLC_NUMERIC="zh_CN.gbk"nLC_TIME="zh_CN.gbk"nLC_COLLATE="zh_CN.gbk"nLC_MONETARY="zh_CN.gbk"nLC_MESSAGES="zh_CN.gbk"nLC_PAPER="zh_CN.gbk"nLC_NAME="zh_CN.gbk"nLC_ADDRESS="zh_CN.gbk"nLC_TELEPHONE="zh_CN.gbk"nLC_MEASUREMENT="zh_CN.gbk"nLC_IDENTIFICATION="zh_CN.gbk"nLC_ALL=n[root@TJ-DB-6CU552YPXSbackup]#n
即文件中某些内容通过sed命令从uft-8转gbk时卡死,设置环境变量LANG=en_US,不进行字符集转换,再次执行sed命令快速返回结果:
[root@TJ-DB-6CU552YPXSbackup]#exportLANG=en_USn[root@TJ-DB-6CU552YPXSbackup]#sed-i"s/.*vip.*pingvalid.*/#&/g"mha_install.shn[root@TJ-DB-6CU552YPXSbackup]#n
sed命令到底是读到哪一行内容出了问题?使用二分查找,很快便定位了问题所在行为325:
[root@TJ-DB-6CU552YPXSbackup]#head-n324mha_install.sh|tail-1|sed-n'1p'nn[root@TJ-DB-6CU552YPXSbackup]#head-n325mha_install.sh|tail-1|sed-n'1p'n^Cn[root@TJ-DB-6CU552YPXSbackup]#head-n325mha_install.sh|tail-1n#生成密钥对n[root@TJ-DB-6CU552YPXSbackup]#n
从输出不难猜测,应该是注释符号和中文之间没有空格,导致sed命令卡死,下面我们论证测试:
[root@TJ-DB-6CU552YPXSbackup]#catfxtest.txtn#生成密钥对n#生成密钥对[root@TJ-DB-6CU552YPXSbackup]#nn[root@TJ-DB-6CU552YPXSbackup]#head-n1fxtest.txt|sed-n'1,$p'n#生成密钥对n[root@TJ-DB-6CU552YPXSbackup]#head-n2fxtest.txt|sed-n'1,$p'n#生成密钥对n^Cn[root@TJ-DB-6CU552YPXSbackup]#n
这个安装脚本已经运行多次了,一直都没问题,为何在这台机器上出了问题?机器操作系统为centos6,估计是sed版本低导致,查看sed版本:
[root@TJ-DB-6CU552YPXSbackup]#sed--versionnGNUsed4.2.1n
找一台centos7机器,查看sed版本:
[root@fxtest01~]#sed--versionnsed(GNUsed)4.2.2n
将centos7上sed拷贝到这台centos6,再次执行同样操作,很快输出结果:
[root@TJ-DB-6CU552YPXSbackup]#head-n2fxtest.txt|sed-n'1,$p'n#生成密钥对n^Cn[root@TJ-DB-6CU552YPXSbackup]#chmod+xsed&&head-n2fxtest.txt|./sed-n'1,$p'n#生成密钥对n#生成密钥对[root@TJ-DB-6CU552YPXSbackup]#n总结
1、注释符号和汉字之间养成使用空格分隔习惯。
2、一些低版本工具在某些特殊情况下可能会触发bug,仔细分析及比对,总会找到问题根源。
本文关键字:#sed##cpu##字符集#
s命令m做的100件事的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于执行sed命令卡死CPU消耗100、s命令m做的100件事的信息别忘了在本站进行查找哦。
还没有评论,来说两句吧...