我需要在我的大学服务器上运行一个java程序。我通过 ssh 通过他们的服务器远程登录
所以我像这样使用 nohup :
nohup java -jar project.jar &
但是,当我注销并关闭终端然后重新登录服务器时,我的进程丢失/被杀死。
答案1
nohup
只让程序免疫SIGHUP
和SIGQUIT
信号。当您从会话注销时,现代 shell 可能会发送其他信号,因此不能保证您的程序不会被终止,即使在nohup
.
更好的解决方案是使用tmux
或screen
,或者如果您使用bash
,您可以尝试:
$ java -jar project.jar &
$ disown
答案2
替代(长期功能失调)的另一种选择nohup
:
setsid java -jar project.jar </dev/zero &>/dev/null &
这有效地“守护”了该进程。它现在由 init 所有,因此永远不会获得 HUP,它的 I/O 流是安全的,并且它已分叉到后台。
请参阅man setsid
获取更多信息。与screen
或不同tmux
,这不是一个声明所有权并继续运行的程序。它只是启动一个自己的程序进程组。
答案3
另一个想法是使用 screen 命令。可以在屏幕内启动程序、分离和注销。之后您可以登录并附加到运行屏幕会话。
教程:http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
答案4
尝试使用 STDOUT 和 STDERR 重定向到 null 来运行 nohup:
nohup java -jar project.jar 2>&1 &