在服务器上运行Java jar文件作为后台进程


105

我需要在服务器中运行Java jar以便在两个应用程序之间进行通信。我已经编写了两个Shell脚本来运行它,但是一旦启动该脚本,就无法关闭/终止进程。如果按ctrl+ C或关闭控制台,则服务器将关闭。谁能帮助我如何修改此脚本以作为普通服务器运行?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

Answers:


242

您可以尝试以下方法:

#!/bin/sh
nohup java -jar /web/server.jar &

&符号可将程序切换为在后台运行。

即使您注销后,nohup实用程序也会使作为参数传递的命令在后台运行。


谢谢安东(Anton),立即通过杀死进程ID来停止服务器。我不认为这是最佳实践。thery命令可以停止服务器吗?
伯纳德·阿里2012年

3
简短的答案:这取决于服务器。长答案:据我所知,没有流程支持如此正常的关闭,就没有安全的方法关闭流程。例如,如果是Web服务器被外部信号终止,则始终有可能丢失某些请求。解决此问题的一种方法是在服务器本身中实现正常的终止功能,例如通过处理特殊类型的请求。然后,可以通过向服务器发送该特殊类型的请求来终止服务器。否则,通过其ID杀死进程是简单的方法。
安东·贝洛格拉佐夫

1
使用nohup应始终与显式重定向stdout和stderr结合使用-否则,您将无法控制日志的去向,并最终nohup.out在碰巧从此脚本调用的任何目录中创建一个难看的文件。
查尔斯·达菲

@Anton,当我使用SSH EXEC runjar.sh运行脚本(就像您的答案一样)时。它开始在我的本地终端中流式传输日志,如果关闭我的终端,则我的jar被杀死。如何使用SSH EXEC在后台运行jar?
AATHITH RAJENDRAN

46

Systemd现在可以在大多数发行版中运行

第1步:

查找您的用户定义服务位于 /usr/lib/systemd/system/

第2步:

用您喜欢的文本编辑器创建一个文本文件 whatever_you_want.service

第三步:

将以下模板放入 文件whatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

第4步:

以超级用户身份运行服务

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

这是现代的方式
-EarthMind

4
在aws ubutnu映像上,我必须安装systemd,然后在/ etc / systemd / system /中找到该映像
Robbo_UK

29

如果您使用的是Ubuntu,并且拥有“ Upstart”(http://upstart.ubuntu.com/),则可以尝试以下操作:

创造 /var/init/yourservice.conf

具有以下内容

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

现在,您可以发出service yourservice startservice yourservice stop命令。您可以拖尾/var/log/yourservice.log以验证其是否正常运行。

如果只想从控制台运行jar,而不会占用控制台窗口,则可以执行以下操作:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
那是系统服务吗?这个问题没有标记为linux,默认情况下很少发行版。
jordanm

1
我将修改问题以说这是使用ubuntu中包含的“ upstart”。
Strelok

1
我相信对于最后的建议,如果您希望它在后台运行并且外壳已释放,您应该这样做: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
蒙塔罗(Montaro),2015年

默认情况下,所有系统作业都位于以下目录中:/ etc / init / ...默认情况下,Ubuntu 14.04中没有/ var / init /目录。
Michael Lafayette

另外,启动服务需要“ sudo”。sudo服务yourservice启动
Michael Lafayette

2

在后台运行,并使用以下命令将日志添加到日志文件:

nohup java -jar /web/server.jar > log.log 2>&1 &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.