如何编写Shell脚本提交Splunk任务并完成后自动下载CSV文件
解决Splunk任务动态等待并自动下载报告的问题
原脚本存在的问题
- 变量名混乱:
jobid和未定义的sid混用,导致无法正确提取任务ID - 固定
sleep 3600不合理:任务时长不确定,过短会导致下载失败,过长可能被新任务覆盖
修改后的脚本
#!/bin/bash # 提交Splunk搜索任务并获取返回内容 response=$(curl -sS -k -u username:password "https://XXXXX.splunkcloud.com:8098/XXXXX/jobs/" -d search="search index=\"prod\" source=\"*log*\" earliest=-1d@d latest=-0d@d | timechart count span=1s | sort - count | head 1") # 精准提取任务ID(适配Splunk API返回的<sid>标签格式) jobid=$(echo "$response" | grep -oP '(?<=<sid>).*?(?=</sid>)') if [ -z "$jobid" ]; then echo "无法获取任务ID,退出脚本" exit 1 fi echo "任务ID: $jobid,开始等待任务完成..." # 轮询检查任务状态,直到任务完成或终止 while true; do # 查询当前任务状态 status=$(curl -sS -k -u username:password "https://XXXXX.splunkcloud.com:8098/XXXXX/jobs/$jobid/" | grep -oP '(?<=<dispatchState>).*?(?=</dispatchState>)') case "$status" in "DONE") echo "任务已完成,开始下载报告..." # 下载CSV格式报告,注意URL参数用引号包裹避免解析错误 curl -sS -k -u username:password "https://XXXXX.splunkcloud.com:8098/XXXXX/jobs/$jobid/results?output_mode=csv&count=0" > report.csv echo "报告已保存到report.csv" exit 0 ;; "FAILED"|"CANCELLED") echo "任务状态: $status,无法生成报告" exit 1 ;; *) echo "当前任务状态: $status,等待5秒后重试..." sleep 5 ;; esac done
关键逻辑说明
- 正确提取任务ID:用正则匹配精准抓取Splunk API返回的任务ID,解决原脚本变量混乱的问题
- 动态状态轮询:循环查询任务的
dispatchState状态,适配不同的任务阶段(排队、运行、完成、失败等) - 轻量重试机制:每次状态检查后等待5秒,避免频繁请求Splunk服务
- 异常终止处理:无法获取任务ID或任务失败时直接退出,避免无效等待
内容的提问来源于stack exchange,提问作者Kunal
相关产品推荐
相关产品推荐

