监控系统Nagios状态类型 SOFT和HARD

搞了这么多久的nagios,居然没用过handle_event事件,正好有事情需要,就学习一下2021.12.27

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

监控系统Nagios系列(二) 架构中提到了如何定义对象的状态,对象状态根据是插件检查结果综合得到的。

对象状态如果发生了变化,Nagios会调用通知命令,发送警报。为了避免错误的警报,Nagios允许用户定义最大尝试次数(max_check_attempts),只有状态连续变化超过了最大尝试次数,才算是的状态变化。Nagios通过定义两种状态变化类型:softhard,分别表示在max_check_attempts内的状态变化,和超过了max_check_attempts的状态变化。这种做法能够解决的一个典型问题就是状态处于抖动不稳定的对象,通过max_check_attempts,避免重复的警报。

1. soft类型

soft类型状态变化产生的条件为:

  • 检查Service或Host状态的插件返回结果为non-OK或non-UP,且检查次数还未达到max_check_attempts,那么这个状态变化是soft类型,是一个soft error。
  • 一个Service或Host从soft error恢复(插件检查返回结果为OK或UP),那么这个状态变化是soft类型,是一个soft recovery。

当soft状态变化发生之后,Nagios对应的处理有:

  • 记录日志
  • 调用外部注册的事件处理回调命令。开发者可以注册事件处理回调命令,尝试修复soft error,在soft error变为hard error之前。

2. hard类型

hard类型状态变化产生条件为:

  • 检查Service或Host状态的插件返回结果为non-OK或non-UP,且检查次数已经达到max_check_attempts,那么这个状态变化是hard类型,是一个hard error。
  • 一个Service或Host的状态由一个hard类型变化为另外一个hard类型,这次变化也是hard类型。如从Warning变为Critical。
  • 一个Service的检查结果为non-OK状态,且与其关联的Host的状态是DOWN或UNREACHABLE,那么Service的状态变化是hard类型,是一个hard error。
  • 一个Service或Host从hard error恢复,那么这个状态变化是hard类型,是一个hard recovery。
  • Service或Host的状态检查类型为passive_check(由外部注入状态),且全局配置文件(nagios.cfg)中的配置项“ passive_host_checks_are_soft”为0,那么passive_check的检查结果导致的状态变化,都是hard类型。

当hard状态变化发生之后,Nagios对应的处理有:

  • 记录日志
  • 调用外部注册的事件处理回调命令。
  • 通知联系人。

PHP的PDF扩展库TCPDF将中文字体设置为内嵌字体的方法

1. 下载要设置的字体,如名为simfang.ttf,放在./vendor/tecnickcom/tcpdf/tools目录中

2.在tools目录中按住shift,点击鼠标右键,点击“在此处打开命令行窗口”,执行语句

1php ./tcpdf_addfont.php -b -t simfang -i simfang.ttf

 便会在./vendor/tecnickcom/tcpdf/fonts/文件夹下面会生成simfang.ctg.z , simfang.php和simfang.z几个文件

3.在调用TCPDF的方法中设置仿宋字体

$pdf = new \Tcpdf(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
 // 设置字体
$pdf->SetFont('simfang', '', 14, '', false);

php的unserialize()返回后的结果分析

php的unserialize()返回后的结果

a:4:{
s:13:”module_rename”;a:1:{i:80;s:6:”档案”;}
s:8:”opentype”;a:1:{i:80;s:3:”tab”;}
s:10:”show_field”;a:1:{i:80;s:9:”from_units”;}
s:11:”union_field”;a:1:{i:80;s:10:”from_units”;}
}

a:4中的a表示4个数组
s:13:”module_rename”;a:1:{i:80;s:6:”档案”;}
s表示字符串,长度13,module_rename是13个字符,因为是数组,所以这个是键值

a:1:{i:80;s:6:”档案”;}是value

php的多维数组排序,还是给出官方的例子,加深记忆

示例 #3 对数据库结果进行排序

本例中 data 数组中的每个单元表示一个表中的一行。这是典型的数据库记录的数据集合。

例子中的数据如下:

volume | edition
-------+--------
    67 |       2
    86 |       1
    85 |       6
    98 |       2
    86 |       6
    67 |       7

数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>

本例中将把 volume 降序排列,把 edition 升序排列。

现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。<?php
// 取得列的列表
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}


// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>

数据集合现在排好序了,结果如下:

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

inotify的参数配置

/proc/sys/fs/inotify/max_user_watches is the current max number of watches per user.

Historically, the kernel has defaulted this to 8192, but given that many Linux distros customize their kernel builds quite a bit, this may not be true on every Linux system. A recent kernel change [1] dynamically selects a default max_user_watches value in the range [8192, 1048576] based on how much RAM the system has. (5.11 is the first kernel release containing this change.)

AFAICT, root can change max_user_watches to any value that’s 2147483647 (231-1) or under, as long as you’re confident you have enough RAM to support that number of watches.

inotifywait的脚本,系统上临时监控够用了

#!/bin/bash
inotifywait -mrq --timefmt '%y%m%d%H%M' --format '%T %w%f %e' --event delete,modify,create,attrib /data/web | while read date file event
    do
        case  $event  in
            MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
            echo  $event' - '$file' - '$date >> /var/log/web_watch.log
            ;;

            MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
            echo  $event'-'$file'-'$date >> /var/log/web_watch.log
            ;;
        esac
    done