shell脚本调用systemctl restart logstash后Elasticsearch索引创建失败求助
问题原因分析
- 脚本存在语法错误:你编写的脚本里
mv /data/test.json /data/test_.json [2]和mv /data/test_.json /data/test.json [4]末尾多了[2]、[4]字符,shell注释需要以#开头,这两个字符会被识别为mv命令的额外参数,直接导致mv执行失败:要么提示找不到目标目录[2],要么文件根本没有完成重命名操作。后续logstash启动时检测到test.json已经存在,不会触发新增文件的读取逻辑,自然不会导入数据。你手动执行的命令里没有这两个多余参数,所以运行正常。 - 如果
[2]、[4]是你写问题时标注的步骤编号,实际脚本中不存在该内容,那么问题出在logstash启动等待机制不可靠:systemctl restart logstash是异步返回的,固定sleep 10秒不一定能保证logstash的file input模块完成初始化、进入目录监听状态。如果在logstash还未启动完成时就把test.json移回目录,logstash启动后会将该文件判定为启动前就存在的旧文件,加上你配置的sincedb_path指向/dev/null,偶尔会出现首次扫描漏读的情况。
修复方案
首先清理脚本语法错误,替换固定等待逻辑为服务状态检测,修改后的参考脚本如下:
#!/bin/bash # 开启执行日志打印,方便后续排查问题 set -ex # 删除旧索引,增加失败校验 curl -s -w "%{http_code}" -XDELETE localhost:9200/myindex | grep -q 200 || { echo "删除索引失败,请检查elasticsearch状态"; exit 1; } # 重命名源文件 mv /data/test.json /data/test_.json sleep 3 # 重启logstash systemctl restart logstash # 等待logstash服务真正启动成功,替代固定sleep while ! systemctl is-active --quiet logstash; do sleep 1 done # 额外等待2秒,确保file input模块完成初始化 sleep 2 # 移回文件触发读取逻辑 mv /data/test_.json /data/test.json # 可选:等待30秒后验证索引是否生成 sleep 30 curl -s localhost:9200/_cat/indices/myindex?v
如果修复后仍有问题,可以排查两个方向:
- 权限校验:执行
ps aux | grep logstash确认logstash的运行用户,再执行ls -l /data/test.json确认该用户对文件和/data目录有可读权限 - 日志排查:查看logstash运行日志
/var/log/logstash/logstash-plain.log,检查是否有文件读取、elasticsearch写入相关的报错
内容的提问来源于stack exchange,提问作者kasug623
相关产品推荐
相关产品推荐

