免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3936 | 回复: 6
打印 上一主题 下一主题

[系统管理] shell脚本执行异常,一直循环 [复制链接]

论坛徽章:
4
2015年亚洲杯之伊朗
日期:2015-02-07 00:41:202015年亚洲杯之伊朗
日期:2015-02-07 13:02:4115-16赛季CBA联赛之福建
日期:2016-04-24 07:22:5215-16赛季CBA联赛之北控
日期:2016-07-05 15:35:19
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-24 10:56 |只看该作者 |倒序浏览
本帖最后由 520harrison 于 2014-10-29 10:14 编辑

脚本目的,分析脚本执行结果,将有问题的项目附加到结果后面。
  1. #!/bin/bash
  2. function analyse_report()
  3. {
  4.         abnormal_item=$1
  5.         IP=$2
  6.                 case "$abnormal_item" in
  7.                         3)
  8.                                 ........
  9.                         ;;
  10.                         4)
  11.                                 ........
  12.                         ;;
  13.                         5)
  14.                                 ........
  15.                         ;;
  16.                         6)
  17.                                 ........
  18.                         ;;
  19.                         7)
  20.                                 ........
  21.                         ;;
  22.                         8)
  23.                                 ........
  24.                         ;;
  25.                         9)
  26.                                 ........
  27.                         ;;
  28.                 esac
  29. }
  30. echo "\n\n" >>Linux_1410221605.txt
  31. echo "****************************The following is the abnormal items****************************\n" >>Linux_1410221605.txt
  32. while read line
  33. do
  34.         Result_line=`echo $line |grep ^[[:digit:]]|grep "XX"`
  35.         for((i=1;i<=7;i++))
  36.         do       
  37.                 Item_num=$[$i+2]  >/dev/null 2>&1
  38.                 IP=`echo $Result_line | awk '{print $1}'`
  39.                 Result=`echo $Result_line|tr -s [" "] [":"]|cut -d ":" -f $Item_num`
  40.                 if [ "$Result" == "--" ]
  41.                 then
  42.                         continue
  43.                 else
  44.                         analyse_report $Item_num $IP
  45.                 fi
  46.         done
  47.        
  48. done < "Linux_1410221605.txt"
复制代码
Linux_1410221605.txt格式
192.168.1.1   test    --    --    XX    --    --    --    --    1410231700         
脚本运行后,发现两个参数没有传递到function,而且程序一直循环,
没找到错误,求解!!! 不胜感激!

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2014-10-24 11:03 |只看该作者
第4行上面加一句:
echo $1 : $2

第51行上面加一句:
echo $Item_num : $IP

这样执行脚本:
chmod u+x test.sh
./test.sh

不要这样执行:
sh test.sh

看看结果如何

论坛徽章:
4
2015年亚洲杯之伊朗
日期:2015-02-07 00:41:202015年亚洲杯之伊朗
日期:2015-02-07 13:02:4115-16赛季CBA联赛之福建
日期:2016-04-24 07:22:5215-16赛季CBA联赛之北控
日期:2016-07-05 15:35:19
3 [报告]
发表于 2014-10-24 12:08 |只看该作者
本帖最后由 520harrison 于 2014-10-29 10:13 编辑

回复 2# Shell_HAT

执行时看到如下
  1. 3:
  2. 3:
  3. 4:
  4. 4:
  5. 5:
  6. 5:
  7. 6:
  8. 6:
  9. 7:
  10. 7:
  11. 8:
  12. 8:
  13. 9:
  14. 9:
  15. 3:
  16. 3:
  17. 4:
  18. 4:
  19. 5:
  20. 5:
  21. 6:
  22. 6:
  23. 7:
  24. 7:
  25. 8:
  26. 8:
  27. 9:
  28. 9:
  29. 3:
  30. 3:
  31. 4:
  32. 4:
  33. 5:
  34. 5:
  35. 6:
  36. 6:
  37. 7:
  38. 7:
  39. 8:
  40. 8:
  41. 9:
  42. 9:
  43. 3:
  44. 3:
  45. 4:
  46. 4:
  47. 5:
  48. 5:
  49. 6:
  50. 6:
  51. 7:
  52. 7:
  53. 8:
  54. 8:
  55. 9:
  56. 9:
  57. 3:
  58. 3:
  59. 4:
  60. 4:
  61. 5:
  62. 5:
  63. 6:
  64. 6:
  65. 7:
  66. 7:
  67. 8:
  68. 8:
  69. 9:
  70. 9:
  71. 3:
  72. 3:
  73. 4:
  74. 4:
  75. 5:
  76. 5:
  77. 6:
  78. 6:
  79. 7:
  80. 7:
  81. 8:
  82. 8:
  83. 9:
  84. 9:
  85. 3:
  86. 3:
  87. 4:
  88. 4:
  89. 5:
  90. 5:
  91. 6:
  92. 6:
  93. 7:
  94. 7:
  95. 8:
  96. 8:
  97. 9:
  98. 9:
  99. 3:
  100. 3:
  101. 4:
  102. 4:
  103. 5:
  104. 5:
  105. 6:
  106. 6:
  107. 7:
  108. 7:
  109. 8:
  110. 8:
  111. 9:
  112. 9:
  113. 3:
  114. 3:
  115. 4:
  116. 4:
  117. 5:
  118. 5:
  119. 6:
  120. 6:
  121. 7:
  122. 7:
  123. 8:
  124. 8:
  125. 9:
  126. 9:
  127. 3:
  128. 3:
  129. 4:
  130. 4:
  131. 5:
  132. 5:
  133. 6:
  134. 6:
  135. 7:
  136. 7:
  137. 8:
  138. 8:
  139. 9:
  140. 9:
  141. 5:192.168.1.1
  142. 5:192.168.1,1
  143. 3:
  144. 3:
  145. 4:
  146. 4:
  147. 5:
  148. 5:
  149. 6:
  150. 6:
  151. 7:
  152. 7:
  153. 8:
  154. 8:
  155. 9:
  156. 9:
  157. 3:
  158. 3:
  159. 4:
  160. 4:
  161. 5:
  162. 5:
  163. 6:
  164. 6:
  165. 7:
  166. 7:
  167. 8:
  168. 8:
  169. 9:
  170. 9:
  171. 3:
  172. 3:
  173. 4:
  174. 4:
  175. 5:
  176. 5:
  177. 6:
  178. 6:
  179. 7:
  180. 7:
  181. 8:
  182. 8:
  183. 9:
  184. 9:
  185. 5:192.168.1.3
  186. 5:192.168.1.3
  187. 5:192.168.1.3
  188. 5:192.168.1.3
  189. 3:
  190. 3:
  191. 4:
  192. 4:
  193. 5:
  194. 5:
  195. 6:
  196. 6:
  197. 7:
  198. 7:
  199. 8:
  200. 8:
  201. 9:
  202. 9:
  203. 5:192.168.1.3
  204. 5:192.168.1.3
  205. 5:192.168.1.3
  206. 5:192.168.1.3
  207. 3:
  208. 3:
  209. 4:
  210. 4:
  211. 5:
  212. 5:
  213. 6:
  214. 6:
  215. 7:
  216. 7:
  217. 8:
  218. 8:
  219. 9:
  220. 9:
复制代码
Linux_* 文件中,有一行是
192.168.1.2 test2       --    --    XX    --    --    XX    --    1410231700  
结果后面附加的信息全都是关于这行的,一直重复
  1. ***************************The following is the abnormal items****************************\n
  2. hostname of  
  3. test2

  4. system_version of  
  5. 2.6.32-279.el6.x86_64

  6. disk_usage of  

  7. *****************

  8. CPU_usage of  
  9. ***********************************

  10. IO_usage of  
  11. ****************************

  12. MEM_usage of  
  13. ************************

  14. SWAP_usage of  
  15. **************
  16. hostname of  
  17. test2

  18. system_version of  
  19. 2.6.32-279.el6.x86_64

  20. disk_usage of  
  21. *******************************

  22. CPU_usage of  
  23. *************************************
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-10-24 15:49 |只看该作者
回复 1# 520harrison

输入输出都是一个文件么?
   

论坛徽章:
3
申猴
日期:2014-10-14 20:12:06巨蟹座
日期:2014-10-20 11:39:452015年迎新春徽章
日期:2015-03-04 10:01:44
5 [报告]
发表于 2014-10-25 17:26 |只看该作者
脚本逻辑看不懂啊,  Linux_1410221605.txt 这个文件是你要读的文件,然后你又在往里面写内容, 这个咋结束得了哦, 读一行写一堆进去。
里面的for循环前也没有判断Result_line这个值到底有没有就直接开始循环了。 循环往Linux_1410221605.txt中写记录....
永远都结束不了

论坛徽章:
4
2015年亚洲杯之伊朗
日期:2015-02-07 00:41:202015年亚洲杯之伊朗
日期:2015-02-07 13:02:4115-16赛季CBA联赛之福建
日期:2016-04-24 07:22:5215-16赛季CBA联赛之北控
日期:2016-07-05 15:35:19
6 [报告]
发表于 2014-10-29 10:03 |只看该作者
本帖最后由 520harrison 于 2014-10-29 10:06 编辑

回复 5# heyong45


  sorry,最近没上论坛,我试过了把if 语句改为
  1. if [ "$Result" = "XX" ]
  2.                         then
  3.                                 analyse_report $Item_num $IP
  4.                         else
  5.                                 continue
  6.                         fi
复制代码
执行正常

又将if语句改为
  1. if [ "$Result" == "--" ]
  2.                         then
  3.                                 continue
  4.                         else
  5.                                 if [ "$Result" == "XX" ]
  6.                                 then
  7.                                         analyse_report $Item_num $IP
  8.                                 fi
  9.                         fi
复制代码
执行也正常,将以上第二个if判断去掉就会无限循环,
这里的逻辑没搞明白,可以给我解释下吗?

以下是要分析的文件
  1. IP_Address      HostName        HN    VER   FS    CPU   IO    MEM   SWAP  Run_Time

  2. 192.168.1.2   hostname1        --    --    XX    --    XX    --    --    1410290900
  3. 192.168.1.1   hostname2        --    --    --    --     --     --    --    1410290900



  4. ****************************The following is the abnormal items****************************

  5. disk_usage of 192.168.1.1
  6. Filesystem         1024-blocks      Used Available Capacity Mounted on
  7. /dev/sda3             15577548  10294920   4491332      70% /
复制代码
以下是可以成功执行的代码
  1. echo "" >>$Report_file
  2. echo "" >>$Report_file
  3. Separative_sign="****************************The following is the abnormal items****************************"
  4. echo  $Separative_sign>>$Report_file
  5. echo "" >>$Report_file
  6. while read line
  7. do
  8.         Result_line=`echo $line |grep ^[[:digit:]]|grep "XX"`
  9.         if [ "$Result_line"  != "$Separative_sign" ]
  10.         then
  11.                 for((i=1;i<=7;i++))
  12.                 do       
  13.                         Item_num=$[$i+2]  >/dev/null 2>&1
  14.                         IP=`echo $Result_line | awk '{print $1}'`
  15.                         Result=`echo $Result_line|tr -s [" "] [":"]|cut -d ":" -f $Item_num`
  16.                         if [ "$Result" = "XX" ]
  17.                         then
  18.                                 analyse_report $Item_num $IP
  19.                         else
  20.                                 continue
  21.                         fi
  22.                 done
  23.         else
  24.                 break
  25.         fi
  26.         done < "$Report_file"
复制代码

论坛徽章:
3
申猴
日期:2014-10-14 20:12:06巨蟹座
日期:2014-10-20 11:39:452015年迎新春徽章
日期:2015-03-04 10:01:44
7 [报告]
发表于 2014-10-29 12:22 |只看该作者
echo "" >>$Report_file  --------------------> 换了一种形式,还是将输出的内容写入了输入的文件,我不知道这是为什么,建议不这么做。
echo "" >>$Report_file
Separative_sign="****************************The following is the abnormal items****************************"
echo  $Separative_sign>>$Report_file
echo "" >>$Report_file
while read line
do
        Result_line=`echo $line |grep ^[[:digit:]]|grep "XX"`  ------->这里大部分情况下会得到空字符,按此脚本的逻辑空内容也会进行处理,产生太多无用的循环,占用系统资源。
        if [ "$Result_line"  != "$Separative_sign" ]------------>这个判断是废的,$Result_line根本就不会出现等于$Separative_sign 的情况,所以这里判断恒为真。
        then
                for((i=1;i<=7;i++))
                do        ---------> 这个for循环也比较奇怪, 在这个循环内IP是不变的,可以放外面获取, 看样子时想检查此行是否有XX,换个方式获取吧,这样太复杂了。 我shell也不咋地判断当前行是否有字段是“XX”,如果有则输出True,否则啥都不输出:echo "Reslut_line"|awk '{i=1;while(i<NF){if($i == "XX"){print "True";break};i++}}'

                        Item_num=$[$i+2]  >/dev/null 2>&1
                        IP=`echo $Result_line | awk '{print $1}'`
                        Result=`echo $Result_line|tr -s [" "] [":"]|cut -d ":" -f $Item_num`
                        if [ "$Result" = "XX" ]
                        then
                                analyse_report $Item_num $IP
                        else
                                continue
                        fi
                done
        else
                break
        fi
        done < "$Report_file"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP