前言
我们在工作时,经常试使用SSH连接到远程主机。这有个令人烦恼的问题,即一旦SSH连接中断,运行的长时任务也会被终止。我们希望有一种机制, 可以让任务在后台运行,然后我们可以断开SSH连接。等一段时间后,我们再次使用SSH连接远程主机,并查看之前运行的长时任务的运行情况。笔者从互联网收集整理了一系列方法实现以上目的。
Linux进程体系介绍
-
linux启动的第一个进程是0号进程,是静态创建的
-
在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。
-
1号进程最终会去调用可init可执行文件,init进程最终会去创建所有的应用进程。
-
2号进程会在内核中负责创建所有的内核线程
-
所以说0号进程是1号和2号进程的父进程;1号进程是所有用户态进程的父进程;2号进程是所有内核线程的父进程。
Ctl+z/jobs/fg/bg
1、创建一个进程,然后使用Ctl+z,让它挂起(停止运行)。挂起的进程会让出控制台。可以使用jobs命令查看这个进程。
2、可以使用bg %[num]让他在后台继续运行。也可以使用fg %[num]让它在前台运行。
注意,不带%使用fg、bg,针对的是左后操作的进程。
3、千万注意: 无论怎么折腾,当当前shell退出后,这个程序会被杀掉。
4、注意:如果没有在进程后面加重定向 > filename 2>&1,转入后台的进程还是会将输出打印到屏幕上。
nohup
1、上面提到,当Shell退出后,shell启动的后台进程会被杀掉。原因是,这些进程是Shell的子进程。Shell退出时,会给所有子进程发送SIGHUP信号。
2、nohup就是让提交的命令忽略 hangup 信号。nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”>filename 2>&1″来更改缺省的重定向文件名。
3、注意:这个方式仅仅是屏蔽了SIGHUP信号,并没有改变进程的隶属关系。不过当Shell退出后,这个进程被1号进程接管。
disown
有时候,运行程序的时候忘记了加nohup,跑了很长时间想起来了为时已晚。其实不晚。可以使用disown命令:
- 先使用Ctl+z将进程挂起,
- 然后使用bg %[num]将进程放入后台运行
- 然后执行: disown -h %[num] 这样,就可以放心地退出了。
TIPS:
- disown -h jobspec 来使某个作业忽略HUP信号。
- disown -ah 来使所有的作业都忽略HUP信号。
- disown -rh 来使正在运行的作业忽略HUP信号。
Screen
参考链接:https://blog.csdn.net/weixin_31510897/article/details/116859308
1、首先先执行screen -S <name> ,创建一个Screen并取一个名字
2、执行长期任务
3、做你想做的其他事情
4、回来后,发现shell断掉了,没关系
5、运行screen -r [id|name], 就可以恢复。
6、在第2步完成后,也可以按Ctl+a+d主动断开连接。