Bash脚本启动Logstash时出现关闭停滞问题求助
解决Logstash管道脚本关闭时停滞无限循环的问题
嘿,我之前也踩过这个Logstash管道脚本的坑!你遇到的关闭进程停滞、无限循环的问题,多半是管道里的进程没正确接收到终止信号,或者Logstash本身没配置成处理完输入就退出。咱们来一步步解决:
1. 给管道进程加统一的终止信号管理
默认情况下,Bash管道里的多个进程可能不在同一个进程组,当你按Ctrl+C时,只有前台进程收到终止信号,后台的进程还在跑,导致脚本卡住。咱们可以用进程组来统一管理:
修改你的Bash脚本,加上信号捕获和进程组控制:
#!/bin/bash # 开启作业控制,让管道内的进程归属同一个进程组 set -m # 启动CSV查找+Logstash管道,放到后台运行 find /指定文件夹路径 -type f -name "*.csv" | logstash -f 你的配置文件.conf & # 获取这个进程组的ID PGID=$(ps -o pgid= $! | grep -o [0-9]*) # 捕获Ctrl+C信号,终止整个进程组 trap "kill -TERM -$PGID; echo '已终止所有相关进程'; exit" INT # 等待所有进程完成 wait
这样当你按Ctrl+C时,整个管道的进程(包括find和Logstash)都会被终止,不会残留进程导致无限循环。
2. 配置Logstash处理完输入后自动退出
Logstash默认会一直监听stdin等待新输入,就算CSV已经全部处理完,它也不会主动退出,这也是导致脚本卡住的常见原因。你需要在Logstash的输入配置里加上exit_after_read参数:
input { stdin { codec => "csv" # 适配CSV输入 exit_after_read => true # 读完所有输入后自动退出Logstash } } # 你的filter和output配置...
这个配置会让Logstash在处理完管道传来的所有CSV内容后,自动退出,不用手动终止。
3. 给find命令加超时保护
有时候find命令可能因为权限问题、文件系统异常卡住,你可以用timeout命令给它加个超时限制,避免无限等待:
timeout 300 find /指定文件夹路径 -type f -name "*.csv" | logstash -f 你的配置文件.conf
这里的300是秒数(5分钟),如果find超过这个时间还没完成,会自动终止,防止拖垮整个脚本。
你可以先试试修改Logstash配置,再调整脚本的进程管理,应该就能解决关闭停滞的问题了!
内容的提问来源于stack exchange,提问作者KevKosDev
相关产品推荐
相关产品推荐

