Linux 命令之 nohup 后台运行程序

目录

需求分析

nohup 命令

操作演示


需求分析

1、使用 Java 开发的可执行 .jar 程序,即可以直接双击运行,也可以使用 java -jar xxx.jar 命令运行,java -jar 命令运行的好处是可以到程序中所以的输出信息。

2、如下所示是在 Windows 系统中运行的样子,当关闭这个 PowerShell 窗口,或者 cmd 窗口时,java 程序也就结束了。

3、java -jar xxx.jar 命令不仅可以在 Windows 上运行,也可以在 Linux 系统上运行。如下所示,xshell 会作为一个输出终端打印应用中所有的输出信息,如果此时按 Ctrl + C、或者直接关闭此连接,则 Linux 系统中 java -jar xxx.jar 打开的应用也会结束。

4、要想关闭窗口应用仍然能继续执行,在 Windows 上则可以不使用 java -jar 命令,而是直接双击运行 .jar 程序即可,而在 Linux 系统上则可以使用 nohup 命令将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端,通俗的说就是程序进行后台运行。

5、后台启动程序是 Linux 中很常见的操作,比如阿里巴巴的 RocketMQ 启动官方也介绍了后台启动的方式:

https://blog.csdn.net/wangmx1993328/article/details/81536168#%E5%90%AF%E5%8A%A8-nameserver

nohup 命令

语法:nohup(选项)(参数)

选项:--help:在线帮助;--version:显示版本信息。

参数:要运行的程序及选项。

1、nohup 命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端(后端运行)。

如果标准输入是一个终端:重定向自 /dev/null
如果标准输出是一个终端:则输出信息会添加到当前目录下的 "nohup.out"文件中,如果当前目录的下的 nohup.out 文件不可写,则输出重定向到"$HOME/nohup.out" (当前登录用户目录下的 nohup.out)。
如果标准错误输出是一个终端:重定向它到标准输出。
保存输出内容到指定的文件:使用 "nohup COMMAND > FILE" 形式的命令。

操作演示

说明:演示中的 game2048-0.0.1-SNAPSHOT.jar 是使用 Spring Boot 写的 Maven 打包的可执行 jar 文件,也是一个 web 应用。

1、nohup command & :表示将 command(命令,通常是程序)进行后台运行(最后的 "&" 号不要忘记)。

[root@localhost home]# nohup java -jar game2048-0.0.1-SNAPSHOT.jar &
[1] 4336
[root@localhost home]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  mavenRepository  nohup.out  settings.xml
[root@localhost home]# 

A)如上所示 "nohup java -jar game2048-0.0.1-SNAPSHOT.jar &",game2048-0.0.1-SNAPSHOT.jar 程序会进行后台启动运行,此时 ctrl + c 或者关闭此连接窗口都不会接受此程序。

B)第2行的 "[1] 4336" 中的 4336 表示程序运行后的进程 PID 值。

C)第三行提示 "忽略输入并把输出追加到"nohup.out",表示程序中的输出信息(日志)都追加到了当前目录下的 nohup.out 文件中了。

D)ls 即可查看到 nohup.out文件,vim nohup.out 即可查看程序的输出信息。

2、nohup java -jar game2048-0.0.1-SNAPSHOT.jar > ./game2048.log &:在第一个基础上将日志输出到了指定的文件中。

[root@localhost home]# nohup java -jar game2048-0.0.1-SNAPSHOT.jar > ./game2048.log &
[1] 4481
[root@localhost home]# nohup: 忽略输入重定向错误到标准输出端
[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  game2048.log  mavenRepository  nohup.out  settings.xml
[root@localhost home]# 

[1] 4481 :表示新开的程序进程 PID 为 2281

第3行表示将输出定向到了自定义的文件(game2048.log)中。

3、nohup java -jar game2048-0.0.1-SNAPSHOT.jar > ./game2048.log 2>&1 &:在第2的基础加了 "2>&1",表示后台运行程序,将标准错误(2)重定向到标准输出(1),然后将标准输出导入文件,结果就是文件中包含了标准输出和标准输入信息。

[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  mavenRepository  settings.xml
[root@localhost home]# nohup java -jar game2048-0.0.1-SNAPSHOT.jar > ./game2048.log 2>&1 &
[1] 4594
[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  game2048.log  mavenRepository  settings.xml
[root@localhost home]#

通常实际中使用第1、第2就够了,如果日志文件需要记录程序的输入信息,则加上 "2>&1"。

4、如果将日志的输出目录设置为 /dev/null,则表示放弃记录日志

[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  mavenRepository  settings.xml
[root@localhost home]# nohup java -jar game2048-0.0.1-SNAPSHOT.jar >/dev/null &
[1] 4666
[root@localhost home]# nohup: 忽略输入重定向错误到标准输出端
[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  mavenRepository  settings.xml
[root@localhost home]# kill -9 4666
[root@localhost home]# nohup java -jar game2048-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
[2] 4700
[1]   已杀死               nohup java -jar game2048-0.0.1-SNAPSHOT.jar > /dev/null
[root@localhost home]# ls
game2048-0.0.1-SNAPSHOT.jar  mavenRepository  settings.xml
[root@localhost home]# 

game2048-0.0.1-SNAPSHOT.jar  运行之后,在 windows 上浏览器就可以访问了,而且即使连接窗口关闭了,程序也会继续运行。

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/86624086