Linux 如何制作一个shell脚本来监视装载和日志问题?

Linux 如何制作一个shell脚本来监视装载和日志问题?,linux,bash,shell,monitoring,mount-point,Linux,Bash,Shell,Monitoring,Mount Point,我正在寻找一种在CentOS 6.5机箱上安装监视器和日志的好方法。由于我是Linux shell脚本的新手,我有点不知所措,不知是否有一些东西已经存在并被证明可以直接插入,或者是否有一种好方法可以指导我的研究来构建自己的脚本 最后,我希望运行的是检查服务器上的9个挂载中的每一个,以确认它们是否正常工作。如果有问题,我想将信息记录到一个文件中,可能会通过电子邮件发送信息,并检查下一次装载。5-10分钟后,我想再次运行它。我知道这可能是不必要的,但如果存在问题,我们正在尝试收集证据,或者向供应商表

我正在寻找一种在CentOS 6.5机箱上安装监视器和日志的好方法。由于我是Linux shell脚本的新手,我有点不知所措,不知是否有一些东西已经存在并被证明可以直接插入,或者是否有一种好方法可以指导我的研究来构建自己的脚本


最后,我希望运行的是检查服务器上的9个挂载中的每一个,以确认它们是否正常工作。如果有问题,我想将信息记录到一个文件中,可能会通过电子邮件发送信息,并检查下一次装载。5-10分钟后,我想再次运行它。我知道这可能是不必要的,但如果存在问题,我们正在尝试收集证据,或者向供应商表明他们所说的问题不是问题。

此shell脚本将测试每个装入点,如果其中任何一个未装入,则向root发送邮件:

#!/bin/bash
while sleep 10m;
do
    status=$(for mnt in /mnt/disk1 /mnt/disk2 /mnt/disk3; do mountpoint -q "$mnt" || echo "$mnt missing"; done)
    [ "$status" ] && echo "$status" | mail root -s "Missing mount"
done
我的目的不是给出一个完整的交钥匙解决方案,而是为您的研究提供一个起点。 为了满足您的精确需求,您需要了解bash和shell脚本、cron作业以及其他非常有用的Unix工具

工作原理
  • #/bin/bash

    这宣布这是一个bash脚本

  • 睡眠时;执行

    这将每隔10分钟在循环中重复一次命令

  • status=$(对于/mnt/disk1/mnt/disk2/mnt/disk3中的mnt;执行装入点-q“$mnt”| | echo“$mnt missing”;完成)

    这将循环通过装入点
    /mnt/disk1
    /mnt/disk2
    /mnt/disk3
    ,并测试每个装入点是否已装入。如果不是,则会创建一条消息并将其存储在shell变量
    status

    您将希望用装载点列表替换
    /mnt/disk1/mnt/disk2/mnt/disk3
    ,无论它们是什么

    这使用命令
    mountpoint
    ,这是现代linux版本的标准。它是
    util-linux
    包的一部分。它可能在旧安装中丢失

  • [“$status”]&&echo“$status”|邮件根目录-s“缺少挂载”

    如果
    status
    包含任何消息,它们将以主题行
    缺少挂载
    的形式发送给root用户

    有几种不同版本的
    mail
    命令。您可能需要调整参数列表以使用系统上的版本

  • done

    这标志着
    while
    循环的结束

笔记
上面的脚本使用
while
循环,每十分钟运行一次测试。如果您熟悉
cron
系统,您可能希望使用它每10分钟运行一次命令,而不是
while
循环。

您应该针对特定问题询问特定问题。由于堆栈溢出对您隐藏了接近的原因:“请编辑问题,将其限制为特定问题,并提供足够的详细信息,以确定适当的答案。避免一次问多个不同的问题。请参阅如何询问页面,以获得澄清此问题的帮助。”这正是我所希望的。它给了我一些方法去做我正在寻找的事情,以及如何修改它以供我自己使用的想法。我可以创建多个实体,这样每个实体都可以测试一个装入点,这样我就可以定制输出消息,从而知道哪个装入是一个问题。我想我还可以添加一个用于将输出写入文件的部分,这样我就可以在系统上跟踪它。非常感谢,这是一个完美且信息量极大的演讲。编辑:刚刚注意到这已经确定了挂载点。处理脚本,我认为它看起来不错(我可能想发布它以捕捉明显的错误,然后在服务器上释放它)。但是我有一个问题,在这个命令中\40是作为一个空格使用,还是有其他方法可以使用?“状态=$”中的mnt也会出现(对于mnt in)需要一个$来标识它以备将来使用,如果没有原因的话?@DanielCox是的,当我们给变量赋值时,我们使用变量名,
mnt
。当我们想要引用该值时,我们使用
$mnt
。在bash中,可以使用空格或制表符或两者的任意组合来表示空格。因此,像“/mnt/Ready for Air”代替“/mnt/disk1”“从您的示例中,不会引起任何问题?我想它会认为空格意味着它应该进入下一个项目。@DanielCox感谢您澄清:只需将任何此类装载点名称用引号引起来即可:
对于mnt,在'/mnt/Ready for Air'/mnt/disk2'/mnt/Ready for Sea'中;do