【问题标题】:How to softly kill a process in Linux?如何在Linux中软杀死一个进程?
【发布时间】:2019-03-09 13:33:50
【问题描述】:

我最近在 linux 操作系统上设置了我的游戏服务器,并使用 SSH 来运行运行游戏服务器的 java 文件。为了让我能够退出 SSH 会话但保持服务器运行,我正在使用 nohup 并创建一个为我执行此操作的脚本:

#!/bin/bash
cd "RSPS"
echo "Booting the RSPS..."
nohup java -Xmx220m -cp bin:lib/* com.ruseps.GameServer &

我可以随时使用tail 命令查看我的服务器的状态,如下所示:

#!/bin/bash
cd "RSPS"
tail -f nohup.out

但是,我的服务器有关闭钩子,它希望退出 java 文件以运行 top 然后 killing 服务的 PID 忽略了关闭钩子,从而破坏了“保存”状态并使我的服务器无法启动.

有没有办法可以重新打开进程并轻柔地终止服务,例如退出它以便文件可以运行关闭挂钩?

我目前正在做的,没有运行关机钩子的是通过命令行使用它:

top
kill PID_HERE

【问题讨论】:

标签: java linux


【解决方案1】:

为了让我能够退出 SSH 会话但保持服务器运行,我正在使用 nohup 并创建一个为我执行此操作的脚本:

首先:不要那样做!

实施适当的服务。如果运行它的机器使用systemd,你所要做的就是写一个单元文件https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files

如果您的机器使用init-script 样式的初始化系统,请复制一些类似网络服务的初始化脚本,例如网络服务器并根据需要进行修改。

请记住,您应该为您的服务器创建一个新的用户/组,以便在启动时检查它是否没有以 root 身份运行(因为这总是一个坏主意)。

但是,我的服务器有关闭钩子

这些钩子是如何实现的?如何通知您的服务器关闭? SIGTERM 信号(这是kill 发送的默认信号,尽管它的名字)是通知进程的标准方式,它们应该优雅地终止。详见Java官方文档:https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/signals.html

【讨论】:

  • 感谢您的信息!我的服务器是树莓派,我只是端口转发 ssh,只有我可以访问!我的关闭挂钩附加到我的 Java 代码 - 我可以调用 System.exit() 并允许游戏客户端发送命令来执行此操作,如果它们具有正确的权限,但对于一个简单的任务来说似乎需要做很多工作。我会考虑使用适当的服务!谢谢
  • @Jaquarh:R-Pi 没关系。重要的是,你有一个长期运行的、面向网络的服务,并且这些东西应该由系统的一部分来管理,该部分已经为这类事情准备好了。通过 init 系统运行它会给你正确的日志记录、在崩溃的情况下自动重生、进程监控、cgrouping 等。所有你想要的东西。就进程管理而言,从控制终端(又名 nohup)分离也是一件非常糟糕的事情。省点麻烦,对 nohup 说不。
  • @Jaquarh:“附加到您的 Java 代码中……”我在哪里可以看到?我们必须能够阅读您的代码,以便为您提供编程建议。
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 2015-01-11
  • 1970-01-01
  • 2015-12-31
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多