最近看了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... (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|