【问题标题】:Is there any way to close a Java application by process id?有没有办法通过进程 ID 关闭 Java 应用程序?
【发布时间】:2013-11-28 15:24:30
【问题描述】:

我有一个在 linux 服务器上运行的 Java 应用程序。启动时,它会将进程 ID 记录到“pidfile”中。

当我关闭它时,我只是从该文件中读取 pid,然后将其杀死:

kill -9 12345

但是其他人说不安全,建议我嵌入一个小型http服务器,并提供一个http api用于关闭,例如:

http://localhost:8080/close

当我想关闭它时,我需要访问它:

curl http://localhost:8080/close

它可以工作但很无聊,我还是更喜欢“进程ID”的方式。有什么方法可以使用进程id安全关闭应用吗?


更新:

这里的“安全”是指我可以取消一些正在运行的任务,这些任务可能会将文件写入磁盘并在退出之前关闭一些资源。

【问题讨论】:

  • 取决于你所说的安全是什么意思?我猜“人们”是在说允许 Java 进程清理和关闭资源,但如果这与您无关,那就不要打扰(尽管kill -HUP 可能会更好一些......)
  • @AndersR.Bystrup 谢谢,我刚刚更新了我的问题

标签: java pid


【解决方案1】:

你可以通过执行kill -HUP processId来关闭它

如果需要优雅地完成工作,请注册您的关闭挂钩并在那里执行所有必需的完成。

更多信息在这里Runtime.addShutdownHook

P.S:在我看来,如果你真的不需要它,不要仅仅为了这个目的而嵌入 Web 服务器。如果您使用网络服务器,您还需要考虑安全性 - 任何知道 url 的人都可以远程关闭您的应用程序:)

【讨论】:

  • 在相关帖子中讨论了关闭挂钩:stackoverflow.com/questions/191215/…
  • 我看到一些文件说kill -HUP意味着重新启动应用程序。但我不希望它“重新启动”,只需关闭它。我有什么误解吗?
  • 应用程序可以做任意事情作为对不会立即杀死它的信号的反应。 HUP 代表挂断,即与用户的连接丢失。这通常会导致优雅的退出。信号在这里解释:en.wikipedia.org/wiki/Unix_signal
  • @Freewind,只是为了添加一点 Axel 所说的内容-您的应用程序接收到 KILL 信号并对其做出反应-在您的情况下“取消一些可能将文件写入磁盘并关闭的正在运行的任务退出前的一些资源”并终止。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2010-09-07
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多