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

127

我需要在服务器上运行一个Java jar文件,以便于两个应用程序之间进行通信。我编写了两个shell脚本来运行它,但是一旦启动该脚本后,我就不能关闭/终止进程。如果我按下ctrl+C或关闭控制台,服务器将关闭。请问有谁能帮我修改这个脚本以正常运行服务器?

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

316

你可以尝试这样做:

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

&符号可以将程序切换到后台运行。

nohup实用程序可以使作为参数传递的命令在您注销后继续在后台运行。


1
谢谢Anton,目前我是通过杀死进程ID来停止服务器,但我认为这不是最佳实践。有没有命令可以停止服务器? - Bernad Ali
3
简短回答:这取决于服务器。较长回答:据我所知,没有安全的方法可以在进程不支持优雅关闭的情况下关闭进程。比如,如果是外部信号终止网络服务器,则总会有一些请求会丢失。解决此问题的一种方式是在服务器本身中实现一个优雅终止函数,例如通过处理特殊类型的请求。然后,可以通过发送该特殊请求来终止服务器。否则,按其ID结束该进程是简单的方法。 - Anton Beloglazov
1
使用 nohup 命令时,应始终显式地重定向标准输出和标准错误流 -- 否则,您无法控制日志的位置,并最终在脚本所在目录中创建一个丑陋的 nohup.out 文件。 - Charles Duffy
@Anton 当我使用SSH EXEC运行脚本(就像你的回答一样)时,它会在我的本地终端流式传输日志,如果关闭我的终端,我的jar文件会被杀掉。我该如何使用SSH EXEC在后台运行jar文件呢? - AATHITH RAJENDRAN

74

Systemd现在在大多数发行版中运行。

步骤1:

找到您的用户定义服务,我的在/usr/lib/systemd/system/中。

步骤2:

使用您喜欢的文本编辑器创建一个文本文件,并将其命名为whatever_you_want.service

步骤3:

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

[Unit]
Description=webserver Daemon

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

[Install]
WantedBy=multi-user.target

第四步:

运行您的服务
作为超级用户

$ 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

这是现代的做法。 - aardbol
4
在AWS Ubuntu镜像上,我需要安装systemd,然后在/etc/systemd/system/找到了该镜像。 - Robbo_UK
我可以在哪里找到使用这种方法的日志? - Sajeer Babu
如果您已经创建了文件,但是遇到“无法启动----服务”的问题,请在第4步之前运行systemctl daemon-reload。https://unix.stackexchange.com/questions/364782/what-does-systemctl-daemon-reload-do - abitcode

34
如果您正在使用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 命令。你可以使用 tail /var/log/yourservice.log 命令验证它是否正常工作。

如果你只想在控制台中运行你的jar文件而不占用控制台窗口,你可以执行以下命令:

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

3
那是一个systemd服务吗?这个问题没有打上Linux标签,很少有发行版默认使用systemd。 - jordanm
1
我将修改问题,以表明这是使用包含在Ubuntu中的“upstart”。 - Strelok
1
我认为,如果您希望该程序在后台运行且 shell 被释放,您应该执行以下操作:java -jar /web/server.jar > /var/log/yourservice.log 2>&1 & - Montaro
所有系统作业默认存储在以下目录:/etc/init/... 在Ubuntu 14.04中,默认情况下没有/var/init/目录。 - Michael Lafayette
另外,启动服务需要使用“sudo”。sudo service yourservice start。 - Michael Lafayette

22

使用以下方式在后台运行并将日志添加到日志文件中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接