Java应用程序不会强制退出,阻止关机


2

我认为El Capitan可能存在一个问题,Java应用程序强制退出,因为我已经看到多个人谈论类似的问题而没有提供实际的解决方案。

我一直在eclipse中编写应用程序,我的一个应用程序偶尔会出现程序结束的问题,但java图标仍然停留在Dock中。

我可以右键单击该图标并告诉它强制退出,但这没有任何效果。如果我使用command-option-escape打开强制退出窗口,应用程序会显示,但同样强制退出不执行任何操作。应用程序未显示在活动监视器中,因此我无法结束该过程。

此应用程序保持打开状态时无法关闭。我必须强制关机并重新启动才能摆脱这个程序。

我可以从终端运行“killall Dock”,这使得应用程序从Dock中消失...但是,应用程序仍然显示在强制退出窗口中,并且仍然无法从那里强制退出。此外,运行此命令后会出现标有“java”的终端窗口。这个新的应用程序不能通过右键单击强制退出,不会显示在强制退出窗口中,也不会显示在活动监视器中。正常关闭仍然是不可能的。

我已经看过各种其他话题,其中人们在El Capitan下使用某些java程序遇到了这个问题,但是大多数都没有细节,没有一个能够真正解决这个问题。

有谁知道为什么会这样?如何防止它在我的程序中发生?如何真正强制退出这样的应用程序?


这不是java问题。我经历过多个应用程序。即使他们退出,他们仍然留在码头,只有关机才能解决问题。
2016年

真?让人惊讶。因此,如果没有其他方法可以阻止这些流程......是时候向Apple报告这个错误了吗?ED:我很好奇 - 这个问题不会发生在每个应用程序,对吗?因此,在我的编码中必须有一些我做错的事情来创建这个问题。我的意思是,和其他一些应用程序开发人员,所以它可能不是显而易见的事情。但它必须是可以预防的,对吧?
Hal Meticulous 2016年

这种情况很少发生在我身上,而且当它确实存在时,我会将它归咎于应用程序本身。我不知道为什么会这样做。
2016年

Answers:


1

如果您使用以下命令知道它的名称,则应该能够使用终端来终止进程。

  1. 找到进程标识符(PID)。用您的流程名称替换[您的流程]。

    ps -e | grep“[你的过程在这里]”

  2. PID将位于最左侧的列中。这是示例输出:

    7642 ttys001 0:00.00 grep

  3. 现在输入到终端,用[PID]代替进程'PID

    kill -9 [PID]

  4. 重新运行步骤2.如果该过程不再存在,则您已成功将其杀死。


步骤简要说明:

  1. ps提供运行过程的信息。在这种情况下,我们过去常常grep过滤掉我们正在寻找的具体过程。

  2. ps列的格式是PID/TTY/TIME/CMD。我们感兴趣的领域是PID

  3. kill -9将不可否认的SIGKILL信号发送到指定的进程PID。任何过程都不能忽略此信号,因此立即终止,无ifs或buts。

  4. 如上所述,ps提供正在运行的进程的信息。如果您的进程不再ps输出,则它不再运行。


我建议你修复那个奇怪的退出bug。

killall Dock只会杀死Dock进程,这会强制更新正在运行的程序。这可能会使您的应用程序从Dock中消失,但应用程序可能仍在后台运行。

就个人而言,我对El Capitan的Java应用程序没有任何问题。我不是Java专家所以我可能不应该为这种意外行为提出任何理由。您是否尝试过提交错误报告


运行“ps -e | grep Main”时,显示的唯一进程是一堆谷歌Chrome助手和grep功能本身。运行“ps -e | grep java”时,只显示grep函数。我假设看起来像java终端的窗口是计算机告诉我应用程序仍然在后台运行的方式,但似乎我没有办法找到进程的名称。
Hal Meticulous 2016年

您是否查看了Activity Monitor以了解这些流程?如果没有,它可能是一个僵尸进程。或者,尝试grep输入项目名称。
也许是

看,我不喜欢粗鲁,但是......你读过什么吗?我在原帖中两次提到Activity Monitor,你评论的回复是关于grep我的项目名称。我会研究僵尸进程,也许这与它有关。
Hal Meticulous 2016年

当我提到Activity Monitor时,我指的是一些模糊命名的流程,这些流程可能不会像您正在寻找的流程那样出现。如果有正在运行的进程,它将在Activity Monitor中。简单地说,我遇到的一些Java进程确实模糊了我从未想过的名字。在你的情况下,它可能是一个僵尸进程。
也许是

好吧,我跑了ps -e | grep“Z”(因为任何僵尸进程在STAT部分都会有Z),但是唯一出现的进程是grep函数本身。java程序通常有哪些名称?我尝试了我的程序名称,“Main”和“java”,但没有出现在Activity Monitor中(尽管程序在强制退出窗口中显示为“Main”)。
Hal Meticulous 2016年

0

在Activity监视器中,它可能只是被称为“java”,因为它是为你运行应用程序的java。如果你运行多个java应用程序,列表中会有多个名为“java”的条目,所以一定要在那里选择正确的条目。您可以通过检查它打开的文件来推断出正确的文件。


在Activity Monitor中没有名为“java”的条目 - 这是特别奇怪的,因为这是创建的终端外观窗口的名称。
Hal Meticulous 2016年

在这种情况下,它可能是LaunchServices问题。你能查看Console.app中的日志吗?
约翰基茨

我看到一些事情说“SecTaskLoadEntitlements failed error = 22”,SEEM与错误开始的时间相匹配。这可能与它有关吗?
Hal Meticulous 2016年

是的,您可能想尝试通过终端
John Keates
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.