gpt4 book ai didi

java - Java应用程序在关闭时被终止而没有发送信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:21 26 4
gpt4 key购买 nike

显然,这是一个upstart/linux调试问题,而不是java问题本身。
我有一个安装了shutdownhook的java应用程序。它在ubuntu gnome中显示了一些有趣的行为,即如果计划重新启动或关机,shutdown hook就不会运行。一开始我认为这是我的关闭挂钩的问题,所以我简化了它,直到它只是写一行到文件(是的,我知道关闭挂钩的log4j2日志问题,所以我也禁用了它们)。当那不起作用时,我开始入侵/etc/init/sendsigs
我将此添加到do_stop函数的开头:

app="$(jps | grep appname.jar | cut -d' ' -f1)"
echo "$app" >> "/home/i30817/output.txt"

果然,这表明它不再运行了,所以关闭挂钩从未被sendsigs激活
然后我使用了来自 here的lastcomm,将sendsigs的编辑替换为:
echo `/home/i30817/lastcomm` >  "/home/i30817/output.txt"

它告诉我Java进程退出了1,并没有发出信号:
java X i30817 ?? 10.26 secs Sun Mar 2 12:44 E 1

但这仍然没能帮我找到真正杀死它的原因。这个问题在一个较小的例子中是不可重现的,所以它可能是在较大的应用程序中(但不是关闭钩子,因为它被最小化了)不喜欢关闭过程并设法终止该过程的东西,但是我无法找出它……将进程输出重定向到文件也不会说明任何问题,例如:
java -jar /home/i30817/Documents/projects/app/dist/app.jar > allout.text 2>&1 

除了正常的应用程序输出外,没有任何内容
你能帮我弄清楚吗?关于同一件事也有很多重复的问题(但他们认为是关闭钩故障)。
编辑:更多的细节,现在我对这个问题有了更好的理解。我认为现在sendsigs上没有进程是正常的。Java应用程序,或者其他应用程序使用来自窗口管理器的协议,在关闭/注销时发送sighup、sighup和sigcont。jvm钩子可以启动关闭钩子。我用一个非常小的例子测试了这个,这个例子只添加了一个关闭钩子,并且在main上有一个无限的循环,并且在后台运行了一个 system tap script
  java -jar app.jar 

在另一个壳里
  sudo stap -o process.txt sigkill.stp

然而,当我在我的申请中尝试时,我想我找到了罪魁祸首:
  PROCESS: SIGSEGV java.signal_generate sent to java 2280

但考虑到没有线程转储或其他什么东西,不知道该怎么办,这很奇怪(只有我的应用程序,只有在关机期间)。
edit2:现在我怀疑“突然”终止而没有核心转储的原因是在关闭期间的ulimit。所以我正试图解决这个问题,为错误报告做准备。我编辑了/etc/security/limits.conf来添加这个并重新启动
   *               soft    core            unlimited
root hard core unlimited
* hard rss 10000

(fs.suid_dumpable=2是由ubuntu设置的,我认为不是apparmor)
但是在关机期间,我再次编辑/etc/init.d/sendsigs来打印ulimit-a,并在终止进程之前休眠30秒,看起来在重启期间ulimit又被重置了?而且,它有一个不同的输出,就像它使用另一个可执行版本一样,例如,它没有说'core file size'而是说'core(dump)'或类似的东西。
编辑3:啊,我需要fs.suid_dumpable=1,现在就试试。
可能init ulimit对于关闭堆芯转储触发并不重要。所有的jvm都是从用户env执行的,所以它应该使用用户ulimit。
编辑4:嗯。在对代码进行了大量的评论之后,我得出了以下结论,我可以从rtfm获得这些结论:
sigsegvs是无害的。
非零退出代码不是。
如果awt仍然处于上升状态,则信号始终为非零,并且关闭挂钩从不运行。即使是一个很小的例子,如果jframe启动了,也仍然会阻止在linux重新启动时执行关闭钩子(与windows不同,它们将在那里启动)。从源代码上看,应用程序关闭挂钩是在插槽1上单独运行的。我敢打赌插槽“0”是awt,这会以某种方式停止系统。
我想是时候检查处理libs的包私有信号了,看看在jvm决定终止所有操作之前,我是否可以叹气,甚至不给运行清理代码的机会。

最佳答案

根据文件
http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
在极少数情况下,虚拟机可能会中止运行,也就是说,在没有完全关闭的情况下停止运行…
如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。

关于java - Java应用程序在关闭时被终止而没有发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22128128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com