【问题标题】:"Inject" commands into a running process将命令“注入”到正在运行的进程中
【发布时间】:2011-08-21 19:20:50
【问题描述】:

我制作了一个 Perl 脚本来启动 Java 游戏服务器,java -jar somejar.jar > /dev/null 2>&1 &

它正常启动和运行,但我希望能够将命令“注入”到正在运行的服务器控制台(以停止重新启动等),因为通过 killall 或 ^C 终止它是危险的。

正常运行时,服务器会显示用户活动日志和输入命令的区域,这是我想“注入”文本的地方。

这可能吗?

谢谢! 贾斯汀

【问题讨论】:

  • 所以应用只暴露了一个交互界面?你能详细说明一下吗?没有批处理模式或命令行功能?您使用的是 Linux 还是 Windows?
  • 这是在 CentOS 5.5 64bit 和官方 Sun/Oracle JVM 上运行的,控制台包含游戏日志的上部,底部有一行输入命令。输入行看起来并不特别,因为随着新项目出现在游戏日志中,您的命令会随之滚动,即使它会随着日志滚动,完整的命令也会在按 Enter 后执行。

标签: java linux input fork pid


【解决方案1】:

如果不调整 Java 应用程序,这样做是不合理的。更改您的应用程序,使其既可以从输入控制台读取命令,也可以从套接字读取命令。。创建一个侦听传入连接的服务器套接字,读取数据并将其解释为命令。从 Perl 脚本或您要执行命令的任何地方,连接到服务器套接字的侦听端口并将命令字符串写入套接字。

您甚至可以创建一个与“命令源”无关的干净抽象。

请注意,有一个受限 API,允许您捕获和解释 POSIX 信号,但它是隐藏的,可能不应该使用。

【讨论】:

    【解决方案2】:

    正如this question 中所讨论的,将标准输入绑定到 FIFO 将不起作用,因为每次将新命令传递到 FIFO 后,您的服务器进程都会看到一个单独的 EOF。我猜最简单的解决方案是在Screen 中运行服务器。更好但更具技术性的解决方案是修改服务器以通过例如套接字接受命令。

    【讨论】:

    • 如果通过屏幕运行,我如何能够将命令注入控制台?
    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多