Linux运维之关闭终端,程序后台运行的5种方法
Java 项目使用 jar 包发布时,一般会执行远程执行 java -jar xxx.jar
。此时命令行会输出 jar 包执行的日志,但 shell 会被阻塞,没有办法执行其他指令。强行 Ctrl + Z 退出后,jar 包进程还在,但被挂起了,前端 web 访问一直在等待。
怎么样才能让 jar 包进程后台运行呢?有以下5种方法:
nohup
最常用的命令就是【nohup】,从名字就看出是否挂起运行命令,关闭终端或者退出某个账号,进程也继续保持运行状态,同样要配合【&】符号一起使用。
用法:nohup Command [ Arg … ] [ & ]
示例:nohup java -jar xxx.jar &
[notice]注意:nohup 指令末尾是有 '&' 符号的,丢失指令无效。[/notice]
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 内置的命令,接收到指定信号时将要采取的行动,后是要处理的信号名,常见的信号如下:
信号 | 值 | 描述 | |
---|---|---|---|
1 | SIGHUP | 挂起进程 | |
2 | SIGINT | 终止进程 | |
3 | SIGQUIT | 停止进程 | |
9 | SIGKILL | 无条件终止进程 | |
15 | SIGTERM | 尽可能终止进程 | |
17 | SIGSTOP | 无条件停止进程,但不终止进程 | |
18 | SIGSTP | 停止或暂停进程,但不终止进程 | |
19 | SIGCONT | 继续运行停止的进程 |
当一个脚本要后台,同样不希望终端退出而关闭程序,我们可以在的脚本中增加trap命令,来忽略SIGHUP信号(挂起进程)。
#!/bin/sh
trap "" HUP
while true;do
date >> /root/test.txt
sleep 1
done
screen
Linux screen 命令用于多重视窗管理程序,它可以创建一个终端,让程序在里面运行。
screen sh test.sh &
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。