想找RedHat Linux的shell脚本,用于检测服务器的IP、丢包率,当丢包率超过40%时Email告警,谢谢!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想找RedHat Linux的shell脚本,用于检测服务器的IP、丢包率,当丢包率超过40%时Email告警,谢谢!相关的知识,希望对你有一定的参考价值。
目前只有检测IP是否畅通的,想修改脚本增加检测服务器IP的掉宝率的,比如掉宝率超过40%触发Email通知,掉包80%出发Email通知,麻烦帮忙修改一下吧,谢谢!
rmail=12345@qq.com
export LANG=zh_CN.UTF-8
ping -c5 192.168.1.10 &>/dev/null
if [ "$?" != "0" ]; then
echo "`date +"%Y-%m-%d %H:%M:%S"` IP地址:192.168.1.10 网络不通,请检查网络!" >>/tmp/pkgloss.txt
mail -s "测试IP网络异常报警" $rmail</tmp/pkgloss.txt
fi
echo "" >/tmp/pkgloss.txt
解答:
#!/bin/bashrmail=12345@qq.com
export LANG=zh_CN.UTF-8
ping -c50 192.168.1.10 >/tmp/ping.txt
if [ "$?" != "0" ]; then
echo "`date +"%Y-%m-%d %H:%M:%S"` IP地址:192.168.1.10 网络不通,请检查网络!" >>/tmp/pkgloss.txt
mail -s "测试IP网络异常报警" $rmail</tmp/pkgloss.txt
fi
loss1=`cat /tmp/ping.txt |grep loss|awk 'print $6'|awk -F% 'print $1'`
if [ $loss1 -gt 40 ]; then
echo "`date +"%Y-%m-%d %H:%M:%S"` IP地址:192.168.1.10 丢包率超过40" >>/tmp/pkgloss.txt
mail -s "测试IP网络异常报警" $rmail</tmp/pkgloss.txt
fi
if [ $loss1 -gt 80 ]; then
echo "`date +"%Y-%m-%d %H:%M:%S"` IP地址:192.168.1.10 丢包率超过80" >>/tmp/pkgloss.txt
mail -s "测试IP网络异常报警" $rmail</tmp/pkgloss.txt
fi
echo "" >/tmp/pkgloss.txt:追问
我测试了,还是不行呢,if [ "$?" != "0" ];这个时候可以发出来邮件,其他掉包的情况就发不出来,和之前的情况一样!
追答应该不会啊,
你可以将/tmp/ping.txt中loss直接改成41或者 81
你的要求是超过40和80才发送邮件。
所以是-gt。如果你尝试文本中是40,那要改成-ge
发送邮件只和判断有关,如果你第一段可以发送的话。
脚本的我还真的不是很懂,拿到脚本也不太会调试,我找到了一份可以用的,不过非常的感谢你,分数请笑纳!
参考技术A ping -c5 192.168.1.10 > result.txtresults=tail -n 1 result.txt | awk 'print $7'
if [$reults -ge 40%]
用这三行替换你的ping语句和if条件就行了追问
不行,掉包的时候还是不能发出邮件!
追答你把代码直接粘过去的吧?
在上面三行代码中,数字1是文件倒数第一行的意思,打开你的result.txt看看丢包信息是不是倒数第一行,不是的话按照实际情况修改一下;
$7是丢包信息所在行中丢包率对应的列数,查可能result看看是不是第七列,不是的话按照实际情况修改一下
Redhat 中的 Perl 和 shell 脚本
【中文标题】Redhat 中的 Perl 和 shell 脚本【英文标题】:Perl and shell script in redhat 【发布时间】:2017-04-11 10:44:17 【问题描述】:我对 Perl、Linux 和 shell 脚本还很陌生。谁能让我知道这段脚本到底在做什么?我已经通过互联网搜索并找不到答案。
#!/bin/bash
set +xe
if [ x"$Link_A" == "x" ] ; then
echo "Link_A parameter not set, DOESNOT execute FUNCTION"
else
cp -f ~/cached-resources/www.github.com/file1/executables/JenkinsScripts/jenkins_feed.pl ./jenkins_feed.pl
perl jenkins_feed.pl $JENKINS_HOME/feed_config.ini $Link_A
fi
感谢任何帮助。
我在 Perl 中添加了源代码并编辑了 shell 参数名称。 我需要更改或附加或放置在系统路径中以使此 Perl 文件运行。
源码:https://github.com/rebeccaus/perl/blob/master/feed.pl
【问题讨论】:
【参考方案1】:这是另一种解释:
#!/bin/bash
# enable debug
set +xe
# this is an old school way to check for an empty variable
# modern shells can use [[ $foo == "" ]] to do this
if [ x"$Link_A" == "x" ] ; then
# a normal error message for when the variable is not set
echo "Link_A parameter not set, DOESNOT execute FUNCTION"
else # the variable has a value so we can use it...
# copy this file to the current directory
cp -f ~/cached-resources/www.github.com/file1/executables/JenkinsScripts/jenkins_feed.pl ./jenkins_feed.pl
# run the script in perl with arguments that include variable
# substitution and some fixed text
perl jenkins_feed.pl $JENKINS_HOME/feed_bts.ini $Link_A
fi
我还重新格式化了脚本,使条件的内部部分缩进。
来自 cmets 的额外问题
Link_A 是文件吗?
Link-A
是一个变量。一个变量可以指向一个文件或目录,但不清楚在这种情况下变量将包含什么。必须检查 perl
脚本才能明确回答这个问题。
feed_bts.ini 是什么意思,如果不存在,我需要显式创建这样的文件吗?
我猜 perl 脚本需要一个文件名作为它的第一个参数。 shell 脚本提供了这个,它期望feed_bts.ini
文件位于$JENKINS_HOME
(另一个变量)目录中。
是否需要将 jenkins_feed.pl 和 feed_bts.ini 保存在同一目录中才能运行脚本?
由于cp
,jenkins_feed.pl
最终与 shell 脚本位于同一目录中。它以~/cached-resources/www.github.com/file1/executables/JenkinsScripts/jenkins_feed.pl
开头。请注意,~
是脚本运行用户的主目录。
perl 脚本从哪个路径执行
这可能会使用随您的发行版安装的任何库存 perl。从技术上讲,shell 将查看您的 $PATH
中的所有目录,直到找到它或用完目录。
perl 脚本分析
第二个参数$Link_A
包含三个信息。在https://github.com/rebeccaus/perl/blob/master/feed.pl#L17 上,这被分成三个变量:$Link_A,$skey,$priority
。
-
第一部分被塞回同名变量中,该变量仅在https://github.com/rebeccaus/perl/blob/master/feed.pl#L90 中使用。看起来它只是出现在描述 (
$desc
) 中特定位置的任意文本,最终出现在 Jenkins XML 字段 IV_DESCRIPTION
。
$skey
进入 Jenkins XML 字段 IV_EVENT_KEY
。这有一个默认值,以防万一https://github.com/rebeccaus/perl/blob/master/feed.pl#L129。
$priority
进入 Jenkins XML 字段 IV_PRIORITY
。
我没有找到任何方便的方法来定义这些字段的作用。它们是对“feed_issue_CREATION
”的 SOAP 调用的一部分。
脚本的第一个参数看起来像一个配置文件。
-
https://github.com/rebeccaus/perl/blob/master/feed.pl#L14 从命令行读取第一个参数。如果它丢失,请转到
usage
子例程。
然后https://github.com/rebeccaus/perl/blob/master/feed.pl#L19 检查以确保它存在并且它是一个文件。如果没有,请再次转到usage
子程序。
https://github.com/rebeccaus/perl/blob/master/feed.pl#L49 以配置文件名作为参数调用readopeninc
子例程。
https://github.com/rebeccaus/perl/blob/master/feed.pl#L287 定义了 readopeninc
子例程,它似乎做了一些事情。它忽略以#
作为绝对第一个字符开头的行。它去除任何前导和尾随空白。然后它假设你有像 shell 这样的变量赋值:VAR_NAME=SOME_VALUE
之后,它似乎将其中的值用作需要更新或关闭的作业。
$inclog
又名feed_INC.txt
在某种程度上是相同的格式。
基于https://github.com/rebeccaus/perl/blob/master/feed.pl#L80,它正在寻找当前目录中的文件。
【讨论】:
感谢您的精彩解释。我在这里有几个问题。 1. Link_A 是文件吗? 2. feed_bts.ini 是什么意思,如果不存在,我需要明确创建这样的文件吗? 3. 我需要将jenkins_feed.pl 和feed_bts.ini 放在同一目录下才能运行脚本吗? 4. perl 脚本从哪个路径执行? 非常感谢 :-) @小鸡 如果你可以的话,你能帮我处理 perl 脚本吗,因为我无法以正确的方式放置这些东西。这会很棒:-) 请编辑最初的问题以包含脚本中的源代码以及您对此有任何具体问题。 我已经添加了源代码仓库,请您帮忙【参考方案2】:请参阅下文以逐行了解脚本的使用 -
#!/bin/bash #### Used to set the type of script "bash"
set +xe #### Used to execute the script in debug mode (set +x) and e is used to receive the input from terminal
if [ x"$Link_A" == "x" ] ; then ##### condition check if x appending something is equal to x means no value in variable LinK_A
echo "Link_A parameter not set, DOESNOT execute FUNCTION" ##### print this line if above condition is true
else ###### if above condition is not true do below operation
cp -f ~/cached-resources/www.github.com/file1/executables/JenkinsScripts/jenkins_feed.pl ./jenkins_feed.pl
#####above line copy the file jenkis_feed.pl from specified directory to current dir forcefully
perl jenkins_feed.pl $JENKINS_HOME/feed_bts.ini $Link_A #### execute jenkil program which take two input parameter
fi
【讨论】:
谢谢@vipin kumar 这里的两个问题是Link_A 的一种文件吗? feed_bts.ini 是什么?那是一个文件,关于内容,它是什么类型的文件?以上是关于想找RedHat Linux的shell脚本,用于检测服务器的IP、丢包率,当丢包率超过40%时Email告警,谢谢!的主要内容,如果未能解决你的问题,请参考以下文章