前言
我們在工作時,經常試使用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
參考鏈接://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主動斷開連接。