实用脚本能批量监听吗?

wen 实用脚本 7

本文目录导读:

实用脚本能批量监听吗?

  1. 批量监听多个文件变化(开发/运维常用)
  2. 批量监听多个网络端口(健康检查或入侵检测)
  3. 批量监听多个进程状态(服务器监控)
  4. 批量监听日志模式(日志聚合与告警)
  5. 使用任务管理工具批量监听(适合大规模集群)
  6. ⚠️ 注意事项

可以。 绝大多数实用脚本工具都支持批量监听,具体实现方式取决于你的使用场景(是监听文件变化网络端口进程状态,还是日志输出)。

以下是几种常见场景的批量监听方案及脚本示例:

批量监听多个文件变化(开发/运维常用)

如果你需要同时监听多个配置文件或日志文件,可以使用 inotifywait(Linux)或 fswatch(跨平台)。

Linux 脚本示例(监听目录下所有 .conf 文件):

#!/bin/bash
WATCH_DIR="/etc/nginx/conf.d"
inotifywait -m -r -e modify,create,delete \
  --format '%w%f %e' \
  "$WATCH_DIR" | while read file event
do
  echo "[$(date)] $file 发生了 $event 事件"
  # 可以在这里执行批量重载命令,nginx -s reload
done

Python 监听多个文件(使用 watchdog 库):

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class BatchHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if not event.is_directory and event.src_path.endswith('.txt'):
            print(f"检测到修改: {event.src_path}")
if __name__ == "__main__":
    paths = ["/data/logs/app1", "/data/logs/app2"]  # 批量监听多个目录
    event_handler = BatchHandler()
    observers = []
    for path in paths:
        observer = Observer()
        observer.schedule(event_handler, path, recursive=True)
        observer.start()
        observers.append(observer)
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        for o in observers:
            o.stop()
        for o in observers:
            o.join()

批量监听多个网络端口(健康检查或入侵检测)

使用 nc(netcat)或 ss 循环检测一组端口。

Shell 脚本示例(每隔5秒检查一批端口是否存活):

#!/bin/bash
ports=(22 80 443 3306 6379)
host="127.0.0.1"
while true; do
  for port in "${ports[@]}"; do
    nc -zv -w2 $host $port 2>/dev/null && echo "[OK] $host:$port" || echo "[FAIL] $host:$port"
  done
  sleep 5
  clear  # 清屏实现滚动静默(可选)
done

更高效的批量扫描(使用 nmapfping):

# 批量监听局域网内多个 IP 的 80 端口
nmap -sT -p 80 --open 192.168.1.0/24 -oG - | grep "/open"

批量监听多个进程状态(服务器监控)

通过 /proc 文件系统或 pgrep 批量监控一组服务进程。

Bash 脚本示例(监控多个关键进程,异常时告警):

#!/bin/bash
process_list=("nginx" "mysqld" "redis-server" "sshd")
while true; do
  for proc in "${process_list[@]}"; do
    if pgrep -x "$proc" > /dev/null; then
      echo "[OK] $proc 正在运行"
    else
      echo "[WARN] $proc 已停止!"
      # 可以在这里发送告警或自动重启
      # systemctl restart $proc
    fi
  done
  sleep 10
  echo "---"
done

批量监听日志模式(日志聚合与告警)

同时对多个日志文件进行 tail 并匹配不同关键词。

#!/bin/bash
# 同时查看多个日志文件并标记来源
tail -f /var/log/nginx/access.log /var/log/mysql/slow.log /var/log/syslog | \
awk '/ERROR/ {print "[ERROR]", FILENAME, $0} /WARN/ {print "[WARN]", FILENAME, $0}'

更高级的做法(使用 multitail):

# 安装 multitail:apt install multitail
multitail -c /etc/nginx/nginx.conf -c /var/log/mysql/error.log

multitail 可以同时打开多个窗口,每个窗口实时滚动不同文件。

使用任务管理工具批量监听(适合大规模集群)

如果你的“批量监听”是指对大量服务器或容器执行同一监听脚本,推荐:

  • Ansibleansible all -m shell -a 'systemctl status nginx' 批量获取几百台机器上 nginx 的状态。
  • tmux / screen:在多个窗口中同时执行相同的监听命令(如 tmux send-keys -t 0:0 'inotifywait ...' Enter)。
  • Grafana + Prometheus:最多可处理百万级指标的时间序列数据,适合大规模监听。

⚠️ 注意事项

  1. 资源消耗:如果被监听的对象数量过多(如 10000+ 文件),使用 inotify 可能需要增加系统限制:
    sysctl fs.inotify.max_user_watches=65536
  2. 不要用 sleep 轮询替代真正的事件驱动:除非被监听对象不支持事件通知(如检查远程 HTTP 服务),否则优先使用 inotifyepollkqueue 等回调机制,避免 CPU 空转。
  3. 日志量过大:批量监听多个高吞吐日志时,建议使用 journalctllnav 或专用的日志分析工具(如 ELK 或 Loki)。

实用建议:

  • 如果你要做文件变化监听 → 用 inotifywaitwatchdog
  • 如果你要做网络端口监听 → 用 ss -tlnpnmap
  • 如果你要做进程状态监听 → 用 pgrep + 循环
  • 如果你要做日志模式监听 → 用 tail -f | grepmultitail

给我具体场景(监听100台服务器的CPU负载”或“监听一个目录下新增的图片文件”),我可以给你写出可直接运行的批量监听脚本。

抱歉,评论功能暂时关闭!