如何在后台运行 Java 程序?

如何在后台运行 Java 程序?

我尝试编写一个init.d脚本来启动这个 java 命令:

java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* com.name.it.svcimpl.OrderRequestDispatcher &

它以后&台进程启动,这很好。当您尝试将其移至前台时,问题就开始了:

[1] 10119
user@server:$ fg 10119
-bash: fg: 10119: no such job

按下回车键后,会发生以下情况:

[1]+  Stopped                 java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* name.alcar.it.svcimpl.OrderRequestDispatcher

如您所见,没有这样的进程10119,那么为什么它会停止呢?但是当命令在 init.d bash 脚本中时,事情变得更加困难:

#!/bin/bash
(cd /opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes; java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* com.name.it.svcimpl.OrderRequestDispatcher &)

(需要在路径下启动/opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes

作为一名非 Java 程序员,我的问题是:

  • 是否可以在后台运行 Java 程序,并可以选择从任何终端会话将其置于前台?

正如您所看到的,在后台运行它确实很重要。任何登录的用户都应该能够将其置于前台。用户正在使用 SSH 连接到终端。

答案1

您无法将不同会话中的进程置于前台。该screen命令可能可以实现您想要的功能。

至于 Java 应用程序无法在 init.d 中运行;您不会更改到该/opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes文件夹​​。您的类路径中有“。”,因此从哪里运行很重要。

理想情况下,我认为您应该保留 bash 脚本并从 init.d 运行它。但是,您也可以明确将完整路径添加到 init.d 类路径中。不过我怀疑您需要使用,screen因为无法将应用程序置于前台。

对于屏幕,这是您正在寻找的示例

$ screen -S myScreen -d -m ./dostuff.sh
$ screen -r myScreen

答案2

fg用途工作号码,不是 PID:

fg: fg [job_spec]
    Move job to the foreground.

工作编号是括号中的数字([1]在本例中)。

不要fg 10119使用 ,而应使用以下任一项:

fg
fg 1

如果要在初始化脚本中运行,则应使用screen(或者tmux如果您希望任意用户将其置于前台。

相关内容