简而言之,您必须以一种特殊的方式启动您的程序,并且您有(至少)两个选择:nohup
或screen
.
现在让我们讨论一下为什么以及如何工作。
nohup
Java 的守护线程不是您要寻找的,它们与问题无关。您可以使用普通线程(甚至是单线程 java 程序)。您只需要更改启动 java 程序的方式。
我有许多在一堆服务器上作为“守护进程”运行的可执行 jar,我制作了一个简单的启动脚本来准备环境并可以在不停止 SSH 连接的情况下终止它。主要部分是如何调用 JVM:您使用nohup。
nohup java -jar myfile.jar > stdout.log &
来自 nohup 的男人,
nohup - 运行一个不受挂断影响的命令,输出到非 tty
因此,当您终止 SSH 连接时,它会将 SIGHUP 发送到它启动的所有进程,这将在您观察时终止它们。但是,使用nohup
,您的进程将不受它的影响。
另外,请注意我将标准输出重定向到一个名为stdout.log
. 这样做是为了让您可以看到您的程序写入 STDOUT 的任何内容(通常是一些对调试有用的日志信息)。
要终止你的程序,你可以使用jps
列出PID
你的进程(比如它123
),然后调用kill 123
. 请注意,要使其正常工作,您的程序需要正确处理这种关闭(这涉及添加一个关闭挂钩,Runtime.getRuntime().addShutdownHook(...)
该挂钩将终止您启动的所有线程)。
如果由于某种原因(错误,或者您没有实现正常关闭),程序在发出kill
命令(发送进程 a SIGTERM
)后不会终止,您可以更改它发送到的信号SIGKILL
with kill -9 123
,这将简单地破坏进程。请注意,这可能与电源故障一样危险(即,假设您在try
a 块的中间try {} finally {}
——您的finally
块将不会执行!)。
screen
有一个替代方案,即使用SCREEN
. 使用它,您可以启动一个不受关闭影响的 shell,并且可以在许多连接之间共享。要使用它,请连接到您的服务器,然后:
screen -R
将启动一个新的 shell,您可以在其中正常运行您的 java 程序:
java -jar myfile.jar
要使其进入后台,只需按ctrl+a ctrl+d
。要将其带回前面,只需screen -R
再次执行即可。如果你想终止你的程序,你可以通过screen
再次进入会话并按下来完成ctrl+c
(如果你的java程序正确地处理了这种关闭)。