[TOC] 背景 一直沒搞清楚 與 的區別, 看著公司里遺留的shell, 也就稀里糊塗地用著... 這是很糟糕的態度 結論放前面 使進程在後臺運行, 預設輸出到標準輸出(即當前屏幕), 除非重定向輸出. 此時忽略 SIGINT 信號. ==若關閉會話, 則進程會結束== 進程仍舊在前臺跑, 預設輸 ...
目錄
背景
一直沒搞清楚 nohup
與 &
的區別, 看著公司里遺留的shell, 也就稀里糊塗地用著... 這是很糟糕的態度
結論放前面
&
使進程在後臺運行, 預設輸出到標準輸出(即當前屏幕), 除非重定向輸出.
此時忽略 SIGINT 信號.
==若關閉會話, 則進程會結束==
nohup
進程仍舊在前臺跑, 預設輸出到 nohup.out
.
此時進程忽略 SIGHUP 信號, 關閉會話不影響進程.
==Ctrl+c
會使進程中斷==
nohup
+ &
進程在後臺跑, 忽略 SIGINT, SIGHUP 信號.
測試
repeat=${1:-20}
echo 迴圈次數 $repeat
counter=0
while [ $counter -lt $repeat ]
do
echo 第${counter}次迴圈
let "counter ++"
sleep 1
done
echo 結束迴圈
直接運行
[root@yjx214 tmp]# sh test.sh
迴圈次數 20
第0次迴圈
第1次迴圈
第2次迴圈
^C
此時不論是直接 Ctrl+c
或 關閉當前ssh連接, 都會導致進程停止
[root@yjx214 tmp]# sh test.sh > test.out
^C
此時進程仍在前端跑, 查看 test.out
文件會發現在輸出, 此時不論是直接 Ctrl+C
或 關閉當前ssh連接, 都會導致進程停止
單獨使用 &
[root@yjx214 tmp]# sh test.sh &
[1] 111418
[root@yjx214 tmp]# 迴圈次數 20
第0次迴圈
第1次迴圈
第2次迴圈
^C
[root@yjx214 tmp]# 第3次迴圈
第4次迴圈
第5次迴圈
^C
[root@yjx214 tmp]# 第6次迴圈
第7次迴圈
第8次迴圈
第9次迴圈
第10次迴圈
第11次迴圈
此時進程在後臺跑, 同時預設會輸出到屏幕上.
此時 Ctrl+c
無效, 即進程忽略了 SIGINT 信號.
但若是直接關閉ssh連接(會話), 則該進程會被關閉, 這是因為進程受到了 SIGHUP 信號影響.
系統對SIGHUP信號的預設處理是終止收到該信號的進程。所以若程式中沒有捕捉該信號,當收到該信號時,進程就會退出。
[root@yjx214 tmp]# sh test.sh > test.out &
[4] 111758
[root@yjx214 tmp]#
使進程在後臺跑, 輸出被重定向到指定文件
可用 jobs -l
獲取當前的所有後臺進程
[root@yjx214 tmp]# jobs -l
[2]+ 113043 Running sh test.sh > /dev/null &
單獨使用 nohup
[root@yjx214 tmp]# nohup sh test.sh > test.out 2>&1
運行後是在前端跑, 若關閉會話, 進程不受影響.
但此時 Ctrl+c
會結束進程.
nohup
+ &
[root@yjx214 tmp]# nohup sh test.sh &
[2] 112987
[root@yjx214 tmp]# nohup: 忽略輸入並把輸出追加到"nohup.out"
[root@yjx214 tmp]#
忽略 Ctrl+c
以及 會話關閉的影響, 進程可以在後臺持續運行.
若會話未關閉, 可通過 jobs -l
查看當前該進程
[root@yjx214 tmp]# jobs -l
[1]+ 112987 Running nohup sh test.sh &