如何在输入中执行脚本时检测错误和非零退出代码,例如exec-input?
我使用logstash执行各种任务,例如通过调用shell或返回一些指标的python脚本进行节点监视。但是,脚本有时会失败,通常使用退出代码1。
问题是Logstash只是忽略了失败,因此失败的命令被忽视了。
有什么方法可以以某种方式拦截故障,至少记录错误?
简单案例:
$ cat myexit.sh
#!/bin/bash
exit 1
$ logstash -e 'input { exec { command => "./myexit.sh" interval=> 10 } } output { stdout {} }' -v
Settings: Default pipeline workers: 1
Registering Exec Input {:type=>nil, :command=>"./myexit.sh", :interval=>10, :level=>:info}
Starting pipeline {:id=>"base", :pipeline_workers=>1, :batch_size=>125, :batch_delay=>5, :max_inflight=>125, :level=>:info}
Pipeline started {:level=>:info}
Logstash startup completed
Running exec {:command=>"./myexit.sh", :level=>:info}
Command completed {:command=>"./myexit.sh", :duration=>0.038, :level=>:info}
2016-03-07T15:05:12.401Z 6755322742e7
没有出现错误的迹象......
答案 0 :(得分:0)
答案 1 :(得分:0)
我的解决方案是让脚本写入stderr:
$cat myexit.sh
#!/bin/bash
echo "THIS IS TEXT SENT TO STDOUT"
>&2 echo "THIS IS TEXT SENT TO STDERR"
然后在启动logstash时,脚本的stderr将位于logstash的标准输出中:
logstash agent -e 'input { exec { command => "myexit.sh" interval=> 10 } } \
output { null { }}' -v -l /config-dir/out.log > out.stdout
标准输出:
$ cat out.stdout
Sending logstash logs to /config-dir/out.log.
THIS IS TEXT SENT TO STDERR
然而,以某种方式访问脚本的退出代码会很不错,但我现在可以不用它了。
我已经将logstash作为服务安装,每次启动时都会覆盖stdout-logs,所以我打算创建一个logstash-conf,它将logstash的日志发送到一个合适的地方,但这是另一个故事