1. 配置文件基础概念
    1. 顺序加载
      1. ~/.monitrc : 用户级别
      2. /etc/monitrc : 系统级别
      3. @sysconfdir@/monitrc : 这个通过 Source 安装可执行, 但 apt 我也不知道在哪
      4. ./monitrc : 命令执行的 "目录级别"
    2. 文件权限检查
      1. 安全问题
      2. 权限控制在 0700 : u=xrw,g=,o= (用户可读写)
    3. 特定语言 DSL
      1. 配合英语的关键字
        1. 'if', 'and', 'with(in)', 'has', 'us(ing|e)', 'on(ly)', 'then', 'for', 'of'
        2. 这些关键字有时候还真难记住. 其是让配置文件可读了, 但不同的人写出来格式都会不一样, 团队的时候还不好适应
    4. 三种类型文件
      1. 无 check 包裹的外围 "set xxx" 这个是全局变量
      2. 全局 include , 用于将内容切分到不同文件中
      3. 文件内的 check 包括块
        1. 这个是最小单元块
        2. 这里就代表了 Monit 能够监控几大类的功能
    5. 可监控类型
      1. 进程监控: CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>
        1. 1. 指定 PID 文件类
        2. 2. 正则匹配进程名字类
          1. 可用 monit procmatch <regx> 来测试
        3. 用途
          1. 这个应该是使用最多的, 保证进程的安全
      2. 程序/脚本监控: CHECK PROGRAM <unique name> PATH <executable file> [TIMEOUT <number> SECONDS]
        1. 1. executable file 文件的绝度路径
        2. 2. 脚本执行的超时时间, 默认 300s
        3. 用途
          1. 如果加上 cron 的语法, 就可以管理后端任务了
      3. 文件监控: CHECK FILE <unique name> PATH <path>
        1. 用途
          1. 这个可以用于监控安全问题
      4. 文件系统监控: CHECK FILESYSTEM <unique name> PATH <path>
      5. 文件夹监控: CHECK DIRECTORY <unique name> PATH <path>
      6. 服务器监控: CHECK HOST <unique name> ADDRESS <host address>
      7. 网络监控: CHECK NETWORK <unique name> <ADDRESS <ipaddress> | INTERFACE <name>>
      8. ??? CHECK FIFO <unique name> PATH <path>
  2. 基本参数
    1. logfile : 日志信息输出
      1. 默认: set logfile = /var/log/monit.log
      2. 也可制成 syslog 语法
    2. daemon : 最基础的 monit poll 信息的间隔时间
      1. 默认 set daemon 120
      2. 数字单位为 秒
    3. init : 让 monit 进程从 /sbin/init 下启动
      1. 这个是用来解决 monit 自身启动的问题
        1. 让 Linux init 进程管理他, 重启自启动 monit
        2. 也可让 crontab 定时启动一次. (init 将 crontab 启动了)
      2. 在 Ubuntu 下 apt-get 安装, 会自动注册 System V 的 init 脚本到 /etc/init.d 下
    4. ssl : 我不太理解, 这里的 SSL 是只什么? 而且这里有一大波的参数
    5. http 后台服务器
      1. 这是非常重要的配置, 但默认是关闭的
      2. 需要将其打开
        1. 1. monit cli 也需要这里提供后端信息支持
        2. 2. 拥有前端 http 协议访问 web 页面
        3. 3. 安全考虑可以监听本地端口. (localhost 或 127.0.0.1)
      3. SET HTTPD PORT <number> [ADDRESS <hostname | IP-address>] [SSL <ENABLE | DISABLE>] [PEMFILE <path>] [CLIENTPEMFILE <path>] [ALLOWSELFCERTIFICATION] [SIGNATURE <ENABLE | DISABLE>] ALLOW <user:password | IP-address | IP-range>+
        1. 核心参数
          1. port number : 指定监听的端口, 默认 2812
          2. hostname | ip-address : 监听的 ip 地址. 经常被用成: user address localhost [use 语义词]
          3. allow
          4. 账户类
          5. user:passwd
          6. @aaa PAM
          7. 网络地址
          8. 192.123.291.29 : ip 地址
          9. 129.298.19.0/255.255.255.0 : 网段
        2. 开启用户密码登陆例子
          1. set httpd port 2812 use address 0.0.0.0 # 使用了 use 语义词, 监听全 ip allow localhost # 必须让本地能够连接 allow wyatt:616 # 远程访问需要验证用户密码
  3. Email 通知参数
    1. set mail-format : 要 email 模板, 不能每次都输入一大堆 Email 发送元信息
      1. set mail-format { from: monit@foo.bar reply-to: support@domain.com subject: $SERVICE $EVENT at $DATE message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION. Yours sincerely, monit }
        1. 重要参数
          1. from: 现在的邮件服务器都不允许随意填写
          2. reply-to: noreply@abc.com 也是邮件服务器所限制
          3. subject: 邮件 title 模板
          4. 可用的 $NAME 变量
          5. $EVENT : A string describing the event that occurred. $SERVICE : The service name $DATE : The current time and date (RFC 822 date style). $HOST : The name of the host Monit is running on $ACTION : The name of the action which was done by Monit. $DESCRIPTION : The description of the error condition
          6. message: 固定的模板格式
        2. 简单的例子
          1. set mail-format { from: noreply@comany.com reply-to: noreply@comany.com subject: $SERVICE emit $EVENT at $DATE message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION. Yours sincerely, monit }
    2. set mailserver : 通过配置邮件服务器将 Email 发出去
      1. SET MAILSERVER <hostname|ip-address> [PORT number] [USERNAME string] [PASSWORD string] [using SSL [with options {...}] [CERTIFICATE CHECKSUM [MD5|SHA1] <hash>], ... [with TIMEOUT X SECONDS] [using HOSTNAME hostname]
        1. 重要参数
          1. ip-address: stmp 地址
          2. port 端口
          3. 587 TLS
          4. 465 SSL
          5. 25 默认
          6. username, password 登陆的账号密码
          7. using ssl, 现在基本邮件服务器都使用 ssl
        2. Gmail 例子
          1. set mailserver smtp.gmail.com port 587 username "MYUSER" password "MYPASSWORD" using tlsv12
    3. alert <email> : 具体通知那个 Email
      1. SET ALERT mail-address [[NOT] {event, ...}] [REMINDER cycles]
        1. 重要参数
          1. email-address: 具体的 email 地址. 猜测是可以 , 连接多个
          2. reminder cycles
          3. monit 在不停的 poll interval 的时候, 只在服务 fail 和 恢复 这两个节点各发一封邮件, 避免重复反复
          4. 但如果 poll interval 循环多了还没有启动, 还是需要知道的. 而 x cycles 则为, 失败了后, 每个几个轮训再发一次邮件
      2. 在 check 包括内
        1. 要发送, 添加 alert 指令
        2. alert <email> 为在 block 内生效的 email 地址
        3. 不要发送, 添加 noalert <email>
    4. 注意, 就这个参数使用了 {} 大括号
  4. Service Test : 这个很重要, 服务器测试
    1. 这个有一大批的测试情况
      1. 因为写成了 DSL
      2. 又因为情况很多
      3. 而且类型也多
    2. 常用类型
      1. Resource Testing : 资源测试 - 系统的硬盘, 内存啊等等
        1. total cpu
        2. total memory
        3. memory
        4. cpu
        5. cpu([user|system|wait])
        6. swap
        7. children
        8. loadavg([1min|5min|15min])
  5. 服务公用参数
    1. Service Method: 动作方法: - 通过 check xxxx 的 block 只要检查什么 - 这里解决做什么动作
      1. <START | STOP | RESTART> [PROGRAM] = "program" [[AS] UID <number | string>] [[AS] GID <number | string>] [[WITH] TIMEOUT <number> SECOND(S)]
      2. check program
        1. 需要以 #! 开头指定执行应用
          1. #! /usr/sh
          2. #! /usr/bin/ruby
          3. ...
        2. 需要 755 可执行权限
      3. restart
        1. 可独自设置 restart 命令
        2. 如果没设, 则先 stop 再 start
    2. Service Poll Time: block 内 interval 在 monit 的整个 daemon 周期之上的 pool interval
      1. 用途
        1. 在 program 一类最有应用场景
          1. 每个一段时间跑一次检查脚本
          2. 当然, 也可一定程度代替 crontab
        2. 这个尽量不使用, 能够使用 cron 代替则代替, 除非真有特定的场景需要这个处理.
    3. group 分组
      1. 就用于分组后过滤 启动/停止用的
      2. group waytt
    4. monit mode
      1. active
        1. 这个是默认
        2. 这个是我们想要
        3. 这个才会主动修复错误
      2. passive
        1. 这个不会修复错误
      3. manual
    5. Restart Limit : 有限制的重启服务 当能够根据触发条件重启服务, 但你总不希 望服务每个 10s 这种极端情况重启吧?
      1. 这个到用的时候, 再查吧.
    6. Service Dependencies : 不同的服务之间有依赖.
      1. 这个到用的时候, 再查吧.