Linux 命令之 nohup 后台运行 jar 包程序,tail、less 实时查看文件内容
nohup 后台运行程序
1、使用 Java 开发的可执行 .jar 程序,即可以直接双击运行,也可以使用 java -jar -Xms216m -Xmx512m xxx.jar 命令运行,java -jar 命令运行的好处是可以到程序中所以的输出信息。在 Windows 系统中,当关闭 PowerShell 窗口,或者 cmd 窗口时,java 程序也就结束了。
2、java -jar -Xms216m -Xmx512m xxx.jar 命令不仅可以在 Windows 上运行,也可以在 Linux 系统上运行,xshell 会作为一个输出终端打印应用中所有的输出信息,如果此时按 Ctrl + C、或者直接关闭此连接,则 Linux 系统中 java -jar xxx.jar 打开的应用也会结束。
3、要想关闭窗口应用仍然能继续执行,在 Windows 上则可以不使用 java -jar 命令,而是直接双击运行 .jar 程序即可,而在 Linux 系统上则可以使用 nohup 命令将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端,通俗的说就是程序进行后台运行。
4、后台启动程序是 Linux 中很常见的操作,比如阿里巴巴的 RocketMQ 启动官方也介绍了后台启动的方式:nohup sh bin/mqnamesrv &
5、nohup 命令格式:
|
语法:nohup(选项)(参数) 选项:--help:在线帮助;--version:显示版本信息。 参数:要运行的程序及选项。 |
6、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 即可查看程序的输出信息,但是无法实时查看。 E)tail -fn 50 nohup.out :实时查看当前目录下的 nohup.out 文件中结尾的 50 条信息。Linux tail 命令 |
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),然后将标准输出导入文件,结果就是文件中包含了标准输出和标准输入信息(通常实际中使用第1、第2就够了,如果日志文件需要记录程序的输入信息,则加上 "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]#
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 上浏览器就可以访问了,而且即使连接窗口关闭了,程序也会继续运行。

Linux 可执行 Shell 脚本
1、如果将命令写在 .sh 脚本文件中,则类似 Windows 上的 .bat 文件一样,可以直接运行脚本文件即可执行脚本中的命令。
2、比如启动一个Java服务包,新建一个 startup.sh 文件,然后输入如下内容:
#!/bin/bash
nohup java -jar -Xms256m -Xmx512m -Xmn200m xxx.jar > nohup.out 2>&1 &
3、Linux 新建普通文件的默认权限为 644 (rw-r--r--),只有读/写权限,没有执行权限(x),系统判定为普通静态文件,因此显示白色。如果脚本文件是绿色,则说明已经通过 chmod 命令添加了执行权限,被识别为可执行程序。
4、给脚本添加执行权限(变绿色),进入脚本所在目录,执行以下任意一条命令(目录也是同理):
# 方法1:符号法(推荐,简洁易懂,为所有用户添加执行权限)
chmod +x startup.sh
# 方法2:数字法(标准脚本权限,rwxr-xr-x)
chmod 755 startup.sh
5、补充说明:颜色仅为视觉标识,白色脚本依然可以通过bash startup.sh执行;绿色脚本支持直接./startup.sh执行(更规范的用法)。
tail 实时查看文件内容
1、tail 命令可用于查看文件的内容,参数 -f 常用于查阅正在改变的日志文件,如实时查看 Java 应用程序输出的日志信息。
2、tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
| 参数 | 描述 |
|---|---|
| -f |
循环读取。按下
|
| -q | 不显示处理信息 |
| -v | 显示详细的处理信息 |
| -c | <数目> 显示的字节数 |
| -n | <行数> 显示文件的尾部 n 行内容 |
| --pid=PID | 与-f合用,表示在进程ID,PID死掉之后结束 |
| -q | --quiet, --silent 从不输出给出文件名的首部 |
| -s | --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒 |
3、常见用法举例:
| 举例 | 描述 |
|---|---|
| tail notes.log | 显示当前目录下 notes.log 文件的最后 10 行信息 |
| tail -f notes.log | 跟踪当前目录下名为 notes.log 的文件的增长情况,按 ctrl + c 可以退出跟踪 |
| tail -c 10 notes.log | 显示当前目录下 notes.log 文件的最后 10 个字符 |
| tail -f -n 50 nohup.out | 实时显示 nohup.out 文件的最后 50 条信息,行数可以自己定义。 |
|
# 实时查看包含 ERROR 的日志(区分大小写) # 忽略大小写过滤 # 排除指定关键词(如排除调试日志) # 查看包含指定内容的日志行 |
|

less 支持翻页 + 实时监控
1、如果除了实时看日志,还需要上下翻阅历史日志,less 是更合适的选择。
# 用less打开日志文件,默认展示文件开头的内容.
less nohup.out
2、进入实时监控模式:按下 Shift + F(等价于 tail -f),日志会自动刷新
3、退出实时模式,回到翻阅状态:按下 Ctrl + C
4、常规翻阅操作:
- 上下箭头:逐行滚动
PageUp/PageDown:翻页查看历史日志/关键词:搜索文件内的指定内容- 完全退出
less:按下q
kill 结束程序
可以先使用 jps -l 命令查询指定服务的PID值,如下面所示前面的数字就是PID值,还可以借助 grep 进行搜索。
[root@localhost 07element-server_5]# jps -l
887372 org.apache.rocketmq.namesrv.NamesrvStartup
1980829 grp-auth-dm-3.1.0-SNAPSHOT.jar
1958046 grp-auth-3.1.0-SNAPSHOT.jar
2018137 bgt-pm-server3.6.0(build20260205)_SP.jar
891082 element-server2-springcloud-3.1.1-SNAPSHOT.jar
110539 bgt-config-server3.5.0(build20251127).jar
[root@localhost 07element-server_5]# jps -l | grep -i basiC
2020371 bgt-basic-controller3.6.0(build20260205)_SP.jar
2017266 basic-web-vue3.6.0(build202602041558)_SP.jar
[root@localhost 07element-server_5]#
1、向进程发送标准的终止信号(SIGTERM,15 号信号),Java 服务会触发优雅关闭逻辑(释放数据库连接、保存缓存数据、完成收尾操作),命令:kill PID值
执行后等待 10~30 秒,让服务完成退出流程,再通过 jps -l 验证进程是否消失.
2、强制终止进程:kill -9 PID值
更多推荐


所有评论(0)