nohup, &做用

最近看了58沈劍的文章"一分鐘瞭解nohup和&的功效", "明明打印到文件了,爲啥tail -f看不到", 對經常使用的nohup和&的瞭解更多了一些,結合這兩篇文章,作些記錄和總結。shell

nohup, &

nohup做用:
1.忽略SIGHUP信號,能夠響應SIGINT信號
2.忽略輸入
3.輸出重定向,默認重定向到當前目錄下nohup.out文件。bash

&做用
1.脫離前臺運行,轉入後臺運行
2.忽略SIGINT信號,能夠響應SIGHUP信號
3.輸出默認到屏幕函數

信號:
Ctrl+C會發送SIGINT信號;
關掉SESSION會話會發送SIGHUP信號.net

常規用法:
nohup command & 1>>outputfile 2>>errorfile
或:
nohup command & 1>>outputfile 2>&1code

printf緩衝區

另外,說下輸出到文件,可是tail -f沒有內容的問題。
本質上,是printf的緩衝區問題。
模仿實現一樣的功能,shell腳本代碼(demo.sh)以下:blog

#/bin/bash
i=0;
while true
do
    let i+=1;
    echo "hello,"$i;
    sleep 1;
done;

執行shell腳本:
nohup bash demo.sh
tail -f nohup.out
只要腳本執行一次,不管是否kill掉進程,會發現輸出已經在默認的nohup.out文件了。進程

一樣功能的C代碼,kill掉進程,在nohup.out文件中沒有輸出內容。
結論:和nohup,&都沒有關係,和C語言的printf函數有關係。
printf是緩衝IO操做,緩衝IO爲了效率,並非每次輸出都寫入內核緩衝區的,而是寫入用戶態緩衝區,等知足條件(緩衝區滿,輸出包含有r或n字符,手動刷新緩衝fflush)才寫入內核緩衝區。
進入內核緩衝區後,有兩種方式把緩衝寫入磁盤:
1.定時進程寫入磁盤;
2.經過sync或者fsync命令手動刷新寫入磁盤。get

看來,C語言的printf有不少知識點。效率

Refer:
printf緩衝區總結
https://blog.csdn.net/skyflyi...
https://blog.csdn.net/k346k34...後臺

相關文章
相關標籤/搜索