nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。在默认情况下(非重定向时),执行 nohup 命令会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出将重定向到 $HOME/nohup.out
文件中。
1、nohup语法
语法格式如下:
nohup Command [ Arg … ] [ & ]
参数说明:
- Command:要执行的命令。
- Arg:一些参数,可以指定输出文件。
- &:让命令在后台执行,终端退出后命令仍旧执行,不会随终端而退出。
实例
以下命令在后台执行 root 目录下的 runbash.sh 脚本:
nohup /root/runbash.sh &
2、linux下运行jar包的几种方式
2.1 方式一:前台执行jar包,锁定SSH窗口
java -jar XXX.jar
特点: 当前ssh窗口被锁定,可按 CTRL + C
打断程序运行,或直接关闭窗口,程序退出。即窗口和当前执行的jar包时锁定关系,当前窗口退出时jar包对应的java进程也会结束。
2.2 方式二:后台执行jar包,不锁定SSH窗口
java -jar XXX.jar &
特点: 该命令和方式一相比多了个 &
, &
代表程序在后台运行。当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。那么,有没有方法让窗口关闭时,程序仍然运行?我们继续往下看。
2.3 方式三:后台执行jar包,不挂断运行命令
nohup java -jar XXX.jar &
特点: 该命令和方式二相比在语句前面多了个 nohup
, nohup
意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到 nohup.out
的文件中,除非另外指定了输出文件。
2.4 方式四:后台执行jar包,不挂断运行命令同时指定输出文件
nohup java -jar XXX.jar >temp.txt &
解释下 >temp.txt
,将command(即前面的java命令)的输出重定向到 temp.txt
文件,即输出内容不打印到屏幕上,而是输出到 temp.txt
文件中。
以上4种方式层层推进,详细介绍了命令行中各参数的作用,方便我们根据实际场景做出正确的选择。
3、如何结束nohup方式运行的程序/进程
上述方式一和二,使用ctrl+z或关闭terminal/shell窗口时,程序/进程即会终止执行。而方式三和四中使用了nohup命令,程序在后台运行,关闭terminal/shell窗口时,程序仍旧在执行中,需使用kill命令终止该进程。
3.1 jobs命令查看进程kill终止进程
使用 jobs -l
命令会列出所有后台执行的作业/后台进程,并且每个作业前面都有个编号。jobs命令只能看当前终端生效的,关闭终端后,在另一个终端中jobs已经无法看到后台跑的程序了,此时需要使用 ps命令(进程查看命令)。
上图输出结果中,输出信息的第一列表示任务编号,第二列表示任务所对应的进程号,第三列表示任务的运行状态,第四列表示启动任务的命令。
- 如果想将某个作业调回前台控制,只需要
fg + 编号
即可。
根据上图可以看到pid为7585,执行 kill 7585
结束该进程。
jobs命令示例:
$ ./test10.sh > testout
^Z
[1]+ Stopped ./test10.sh > testout
# 查看当前作业
$ jobs
[1]+ Stopped ./test10.sh > testout
# -l,列出进程的PID和作业号
$ jobs -l
[1]+ 96267 Suspended: 18 ./test10.sh > testout
# -p,只列出作业的PID
$ jobs -p
96267
# -s,只列出停止的作业
$ jobs -s
[1]+ Stopped ./test10.sh > testout
# -r,只列出运行的作业
$ jobs -r
$ jobs -l
[1]+ 96267 Suspended: 18 ./test10.sh > testout
[3]- 96292 Done ./test10.sh > testb
3.2 ps命令查看进程kill终止进程
- 首先要找到进程对应的 pid,我们可以使用 ps 命令。
ps aux | grep runbash.sh
或者使用以下命令:
ps -ef | grep java
通过上述命令查找到 nohup 运行脚本 runbash.sh
后生成的进程的 PID,然后可以使用 kill 命令来删除。
- 找到 PID 后,就可以使用 kill PID 命令来删除了。
kill -9 进程号PID
评论区