最近看了58沈剑的文章”一分钟了解nohup和&的功效“, “明明打印到文件了,为啥tail -f看不到“, 对常用的nohup和&的了解更多了一些,结合这两篇文章,做些记录和总结。
nohup, &
nohup作用:
1.忽略SIGHUP信号,可以响应SIGINT信号
2.忽略输入
3.输出重定向,默认重定向到当前目录下nohup.out文件。
&作用
1.脱离前台运行,转入后台运行
2.忽略SIGINT信号,可以响应SIGHUP信号
3.输出默认到屏幕
信号:
Ctrl+C会发送SIGINT信号;
关掉SESSION会话会发送SIGHUP信号
常规用法:
nohup command & 1>>outputfile 2>>errorfile
或:
nohup command & 1>>outputfile 2>&1
printf缓冲区
另外,说下输出到文件,但是tail -f没有内容的问题。
本质上,是printf的缓冲区问题。
模仿实现同样的功能,shell脚本代码(demo.sh)如下:
#/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命令手动刷新写入磁盘。
看来,C语言的printf有很多知识点。
Refer:
printf缓冲区总结
https://blog.csdn.net/skyflyi…
https://blog.csdn.net/k346k34…