我有一个由 upstart 管理的进程。它会在出现内部异常时发送错误报告,但由于该应用程序不是用 C 编写的,因此它无法捕获 SIGSEGV 并发送错误报告。(这在 C 中也不是一种好的做法)。
我认为应该可以让 upstart 启动一个脚本来发送错误报告,但我不知道该怎么做。似乎有三种可能的方法:
1) 停止后脚本。但是,EXIT_SIGNAL 在停止后脚本中不可用
2) start on stopped
. 使用脚本创建单独的 upstart 配置start on stopped
。这很有效,但前提是我respawn
从原始配置中删除。这是不可接受的。
3)使用脚本技术:
script
cmd &
PID=$!
wait $PID
if [ $? = 139 ] ; then cleanup ; fi
end script
但是,upstart 脚本块似乎像set -e
在 shell 中一样工作,因此当 cmd 失败时脚本就会退出,并且我们永远不会进入 if 块。
答案1
成功了。这个技巧与 #3 类似,但使用文件中的 shell 脚本,而不是内联在 upstart.conf 中。这样,您可以跳过,-e
并且可以使用 bash 而不是 dash。
如果您确实想避免使用单独的脚本,则可以-e
通过使用以下命令来绕过该行为||
:
script
cmd &
PID=$!
wait $PID || export EXIT_CODE=$?
if [ $EXIT_CODE -eq 139 ] ; then cleanup ; fi
end script