You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

如果修复后仍有问题,可以排查两个方向:

  1. 权限校验:执行ps aux | grep logstash确认logstash的运行用户,再执行ls -l /data/test.json确认该用户对文件和/data目录有可读权限
  2. 日志排查:查看logstash运行日志/var/log/logstash/logstash-plain.log,检查是否有文件读取、elasticsearch写入相关的报错

内容的提问来源于stack exchange,提问作者kasug623

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:00:02