nohup 與 & 區別

從 Linux 信號機制 到 SIGINTSIGHUP 信號含義 到 nohup& 的區別,逐步解釋


Linux信號機制

在計算機科學中,信號是Unix、類Unix以及其餘POSIX兼容的操做系統中進程間通信的一種有限制的方式。 它是一種異步的通知機制,用來提醒進程一個事件已經發生。當一個信號發送給一個進程,操做系統中斷了進程正常的控制流程,此時,任何非原子操做都將被中斷。若是進程定義了信號的處理函數,那麼它將被執行,不然就執行默認的處理函數。shell

Linux信號列表

經過kill -l命令得到

信號類型

  • SIGINT信號session

    程序終止(interrupt)信號, 在用戶鍵入INTR字符(一般是Ctrl-C)時發出,用於通知前臺進程組終止進程。異步

  • SIGHUP信號函數

    本信號在用戶終端鏈接(正常或非正常)結束時發出, 一般是在終端的控制進程結束時, 通知同一session內的各個做業, 這時它們與控制終端再也不關聯。登陸Linux時,系統會分配給登陸用戶一個終端(Session)。在這個終端運行的全部程序,包括前臺進程組和後臺進程組,通常都屬於這個Session。當用戶退出Linux登陸時,前臺進程組和後臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操做爲終止進程,所以前臺進程組和後臺有終端輸出的進程就會停止。此外,對於與終端脫離關係的守護進程,這個信號用於通知它從新讀取配置文件。測試

ctrl + c 產生SIGINT信號,關閉shell窗口產生SIGHUP信號操作系統

比較 & 和 nohup


測試代碼以下:日誌

用C寫一個腳本,test.out,腳本內容以下:code

#include <stdio.h>

void main()
{
    int i=0;
	while(1){
		printf("hello,%d\n", i++);
		sleep(1);
	}

}

是一個輸出hello與循環輪數的死循環程序,每輸出一行就休眠1秒。進程

直接執行腳本

./test.out

程序每隔一秒會在終端輸出一個字符串。事件

此時若是鍵入Ctrl+C ,程序會收到一個SIGINT信號,若是不作特殊處理,程序的默認行爲是終止。

關閉 session, 程序會收到一個SIGHUP信號,若是不作特殊處理,程序的默認行爲是終止。

&

運行程序時在命令後邊加一個&符號,&的意思是在後臺運行

執行腳本 ./test.out &

程序每隔一秒會在終端輸出一個字符串。

查看進程號 ps -aux | fgrep test.out

此時鍵入Ctrl + C,發出SIGINT信號,程序會繼續運行。(查看進程號,進程號依舊在,且進程號同樣。)

若是關掉session,程序會收到一個SIGHUP信號, 進程終止。(查看進程號,進程不在。)

nohup

nohup: no hang up,不掛起,忽略SIGHUP信號。

執行腳本 nohup ./test.out

發現此時終端沒有像以前那樣,每隔一秒輸出一個字符串

查看進程號 ps -aux | fgrep test.out,進程存在。

此時鍵入Ctrl + C,發出SIGINT信號,程序終止。(查看進程號,進程不在。)

若是關掉session,程序會收到一個SIGHUP信號, 進程終止。(查看進程號,進程號依舊在,且進程號同樣。)

結論

  • 使用&後臺運行程序:
- 結果會輸出到終端;
- 使用 Ctrl + C 發送SIGINT信號,程序免疫;
- 關閉session發送SIGHUP信號,程序關閉
  • 使用nohup運行程序:
- 結果默認會輸出到nohup.out(不會輸出到終端);
- 使用Ctrl + C 發送SIGINT信號,程序關閉;
- 關閉 session 發送SIGHUP信號,程序免疫

因此,要想進程不受shell中Ctrl C和Shell窗口關閉的影響,就將nohup和&指令一塊兒使用

nohup ./test.out &

同時免疫SIGINT和SIGHUP信號 。

通常不將nohup輸出到 nohup.out 文件,若全部的nohup都輸出到到該文件,則該文件會很大,而是將各自輸出重定向其餘的文件。(如日誌文件)

相關文章
相關標籤/搜索