Java 项目使用 jar 包发布时,一般会执行远程执行 java -jar xxx.jar。此时命令行会输出 jar 包执行的日志,但 shell 会被阻塞,没有办法执行其他指令。强行 Ctrl + Z 退出后,jar 包进程还在,但被挂起了,前端 web 访问一直在等待。

怎么样才能让 jar 包进程后台运行呢?有以下5种方法:

nohup

最常用的命令就是【nohup】,从名字就看出是否挂起运行命令,关闭终端或者退出某个账号,进程也继续保持运行状态,同样要配合【&】符号一起使用。

用法:nohup Command [ Arg … ] [ & ]

示例:nohup java -jar xxx.jar &

注意:nohup 指令末尾是有 '&' 符号的,丢失指令无效。

setsid

nohup是忽略 SIGHUP 信号,setip 命令可以重新打开了会话,继承了父进程组的 ID,脱离了父进程的控制。

用法:setsid Command [ Arg … ]

示例:setsid java -jar xxx.jar

setsid 和 nohup 还有一个区别是,不需要使用 & 后台符号。

exit

使用 exit 命令退出终端,我们的程序还是会继续运行,这是为什么呢?

这是因为使用 exit 命令退出终端时不会向终端所属任务发 SIGHUP 信号,是 huponexit 配置项控制的,默认是 off,可以使用shopt 命令查看。

> shopt | grep huponexit
huponexit off
# 开启 exit 挂起进程
> shopt -s huponexit
> shopt | grep huponexit
huponexit on

trap

trap 命令 linux 内置的命令,接收到指定信号时将要采取的行动,后是要处理的信号名,常见的信号如下:

信号描述
1SIGHUP挂起进程
2SIGINT终止进程
3SIGQUIT停止进程
9SIGKILL无条件终止进程
15SIGTERM尽可能终止进程
17SIGSTOP无条件停止进程,但不终止进程
18SIGSTP停止或暂停进程,但不终止进程
19SIGCONT继续运行停止的进程

当一个脚本要后台,同样不希望终端退出而关闭程序,我们可以在的脚本中增加trap命令,来忽略SIGHUP信号(挂起进程)。

 #!/bin/sh  
trap "" HUP  
while true;do  
date >> /root/test.txt  
sleep 1  
done 

screen

Linux screen 命令用于多重视窗管理程序,它可以创建一个终端,让程序在里面运行。

screen sh test.sh &

以上内容转自:Linux运维之,关闭终端,程序后台运行,我有5种方法你呢? - 51cto