linux监听一个文件,并做出相应操作

DBC 578 0

linux监听一个文件,并做出相应操作插图

先上代码

#!/bin/bash

LOG_FILE="你需要监听的日志文件"
PATTERN_1="监听到什么字符就触发"
PATTERN_2="JVM running for"
SCRIPT_1="需要执行的sh脚本"
SCRIPT_2="/em.sh"

last_line_1=""
last_line_2=""

tail -n0 -F "$LOG_FILE" | while read -r line; do
    if [[ $last_line_1 != "$line" ]]; then
        if echo "$line" | grep -q "$PATTERN_1"; then
            sh "$SCRIPT_1"
        fi
        last_line_1="$line"
    fi

    if [[ $last_line_2 != "$line" ]]; then
        if echo "$line" | grep -q "$PATTERN_2"; then
            sh "$SCRIPT_2"
        fi
        last_line_2="$line"
    fi
done
温馨提示

很简单,监听一个日志文件,当日志文件新的一行出现对应的字符,则执行对应的sh脚本

关键位置详细解释

<pre>
tail -n0 -F "$LOG_FILE" | while read -r line; do
    if [[ $last_line_1 != "$line" ]]; then
        if echo "$line" | grep -q "$PATTERN_1"; then
            sh "$SCRIPT_1"
        fi
        last_line_1="$line"
    fi

    if [[ $last_line_2 != "$line" ]]; then
        if echo "$line" | grep -q "$PATTERN_2"; then
            sh "$SCRIPT_2"
        fi
        last_line_2="$line"
    fi
done
</pre>

这部分代码是一个循环结构,用于实时监听日志文件的内容,并根据条件触发相应的脚本执行。下面是代码的详细解释:

  • tail -n0 -F "$LOG_FILE": 使用 tail 命令来实时监视指定日志文件的内容。-n0 表示从文件末尾开始读取,-F 表示跟踪文件的变化并实时输出新的内容。
  • | while read -r line; do: 通过管道将 tail 命令的输出传递给 while 循环,并使用 read 命令将每行内容赋值给变量 line
  • if [[ $last_line_1 != "$line" ]]; then: 检查当前读取的行是否与上一次读取的行不同,如果不同,则执行下面的语句块。
  • if echo "$line" | grep -q "$PATTERN_1"; then: 使用 echo 命令将当前行的内容输出,并通过管道传递给 grep 命令,查找是否匹配模式1 $PATTERN_1-q 选项用于静默模式,不输出匹配结果。
  • sh "$SCRIPT_1": 如果模式1匹配成功,则执行指定的脚本1。
  • last_line_1="$line": 将当前行赋值给变量 last_line_1,以便在下一次循环中进行比较。
  • if [[ $last_line_2 != "$line" ]]; then: 检查当前读取的行是否与上一次读取的行不同,如果不同,则执行下面的语句块。
  • if echo "$line" | grep -q "$PATTERN_2"; then: 使用 echo 命令将当前行的内容输出,并通过管道传递给 grep 命令,查找是否匹配模式2 $PATTERN_2
  • sh "$SCRIPT_2": 如果模式2匹配成功,则执行指定的脚本2。
  • last_line_2="$line": 将当前行赋值给变量 last_line_2,以便在下一次循环中进行比较。

这个循环会持续监听日志文件的变化,每当出现匹配的模式时,对应的脚本将被执行。

发表评论 取消回复
表情 图片 链接 代码

分享