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...后台

相关文章
相关标签/搜索