今天在工作中,lz要在Linux系统上运行一个java程序,这个程序要在系统中持续运行。随后lz无意将ssh窗口关掉了,发现java程序停止了。原来,当使用ssh连接到系统运行程序的时候,该程序已经和你的ssh连接绑定了。如果你关闭连接,该程序就会停止。还有一个情景:如果要在后台运行多个java程序的时候,就需要启动多个ssh窗口,这样很麻烦。有没有方法来解决这个问题呢?答案是肯定的。
1.使用nohup来执行命令,它会把命令自动调到linux后台运行,不锁定当前ssh窗口,也不会被ctrl + c,alt + F4之类打断程序的动行。
1 |
nohup java -jar test.jar & |
执行完该命令后,终端会显示如下信息:
1 2 |
[1] 27945 nohup: 忽略输入并把输出追加到"nohup.out" |
[1]:该后台任务的jobid
27945:是该进程的pid
nohup.out:是该任务的输出位置
2.要指定重定向的文件,如下:
1 |
nohup java -jar test.jar > test.log 2>&1 & |
3.如果一个任务已经在前台执行,那就使用以下方法来将任务调整到后台:
(1)首先,在正在执行任务的终端使用ctrl+z
1 |
[1]+ 已停止 java -jar test.jar |
(2)使用bg命令将该任务调整至后台(fg与之相反,将后台任务调整至前台)
1 |
bg %1(1是jobid) |
如果不知道jobid,也可以使用jobs命令来查询。
但是任务的输出还是会打印到终端上的(具体怎么将输出重定向到别的地方,lz也不造)。而且,这时该任务还是与当前终端相关联的,关闭终端还是会断掉该任务的。使用下面命令来解决:
1 |
disown -h %1 |
这样再也不用担心关掉终端会停止掉任务喽!!!
PS:再来说说nohup吧。nohup的意思是no hang up,就是说关掉终端是不会挂掉程序的。如果开始执行命令时只使用&:
1 |
java -jar test.jar & |
那么该任务也会在后台执行,但是一旦关掉终端该任务还是会挂掉,所以这就是nohup的用处了。