本文目录导读:

- 批量监听多个文件变化(开发/运维常用)
- 批量监听多个网络端口(健康检查或入侵检测)
- 批量监听多个进程状态(服务器监控)
- 批量监听日志模式(日志聚合与告警)
- 使用任务管理工具批量监听(适合大规模集群)
- ⚠️ 注意事项
可以。 绝大多数实用脚本工具都支持批量监听,具体实现方式取决于你的使用场景(是监听文件变化、网络端口、进程状态,还是日志输出)。
以下是几种常见场景的批量监听方案及脚本示例:
批量监听多个文件变化(开发/运维常用)
如果你需要同时监听多个配置文件或日志文件,可以使用 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
更高效的批量扫描(使用 nmap 或 fping):
# 批量监听局域网内多个 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 可以同时打开多个窗口,每个窗口实时滚动不同文件。
使用任务管理工具批量监听(适合大规模集群)
如果你的“批量监听”是指对大量服务器或容器执行同一监听脚本,推荐:
- Ansible:
ansible all -m shell -a 'systemctl status nginx'批量获取几百台机器上 nginx 的状态。 - tmux / screen:在多个窗口中同时执行相同的监听命令(如
tmux send-keys -t 0:0 'inotifywait ...' Enter)。 - Grafana + Prometheus:最多可处理百万级指标的时间序列数据,适合大规模监听。
⚠️ 注意事项
- 资源消耗:如果被监听的对象数量过多(如 10000+ 文件),使用
inotify可能需要增加系统限制:sysctl fs.inotify.max_user_watches=65536
- 不要用 sleep 轮询替代真正的事件驱动:除非被监听对象不支持事件通知(如检查远程 HTTP 服务),否则优先使用
inotify、epoll或kqueue等回调机制,避免 CPU 空转。 - 日志量过大:批量监听多个高吞吐日志时,建议使用
journalctl、lnav或专用的日志分析工具(如 ELK 或 Loki)。
实用建议:
- 如果你要做文件变化监听 → 用
inotifywait或watchdog - 如果你要做网络端口监听 → 用
ss -tlnp或nmap - 如果你要做进程状态监听 → 用
pgrep+ 循环 - 如果你要做日志模式监听 → 用
tail -f|grep或multitail
给我具体场景(监听100台服务器的CPU负载”或“监听一个目录下新增的图片文件”),我可以给你写出可直接运行的批量监听脚本。