摘要:则发现程序并不会完整输出行数据,只是部分数据。如不关闭,将会浪费系统资源,这倒是小事,造成进程所在的文件系统无法卸下以及引起无法预料的错误。所以需要关闭这些关闭标准输入输出与错误显示。
总结一下先~
一个守护进程一般需要root权限,因为可能要使用特殊端口1-1024及其他权限
一个守护进程的父进程会被fork之后被杀掉,所以可以说他的父进程是init进程。
一个守护进程无需交互,也和终端(teriminalsession)无关,所以任何输出,无论是向标准输出还是错误输出,都需要特殊处理,涉及到的就是stdout和stderr
上代码下面是我用php 编写一个守护进程 demo
好下面我们执行操作,输出如下
root@tb:/home/tb/linuxing# php php_daemon.php fork succ loop0 root@tb:/home/tb/linuxing# loop1 loop2 loop3 loop4 ... loop20查看demo.txt
cat demo.txt 0--2016-07-15 17:49:47 1--2016-07-15 17:49:48 2--2016-07-15 17:49:49 ...问题来了貌似没有问题,但是用以上php代码,执行后,马上关闭当前终端。则发现程序并不会完整输出20行数据,只是部分数据。
问题复现步骤:
1.ubuntu终端Azhong 执行 php php_daemon.php
2.关闭终端A
3.打开新终端B,ps -aux |grep php 发现无此进程如果手慢,自己把握时间或者调整for 次数。。
为什么呢进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,(这倒是小事),造成进程所在的文件系统无法卸下以及引起无法预料的错误。
所以需要关闭这些fclose(STDIN),fclose(STDOUT),fclose(STDERR)关闭标准输入输出与错误显示。
正确代码之一再解释一下如果想在关闭当前终端后继续执行
需要关闭echo 那一行,因为当然echo 和当然session关联,sesssion关闭后,echo就会导致php致命错误,所以下面的file_put_contents不会执行。所以为了避免除显示输出的echo导致php错误的问题,我们一般建议这样
global $STDOUT, $STDERR; fclose(STDOUT); fclose(STDERR); $STDOUT = fopen("/dev/null", "rw+"); $STDERR = fopen("/dev/null", "rw+");加上上面那句,所有的显示的不显示的echo err之类都可以被忽略。也就是说你把
更优处理办法
echo "loop" . $i . "n";这句加上也没有问题
指到dev/null,,如果你不这样,你的stdout会跟你的session有关。。
你的session一关,你的stdout就失效,,echo就报错了。感谢三金 CFC4N
守护进程详解及创建,daemon()使用
不懂的太多当然这只是个例子,实际中还需要考虑目录权限,umask,figchld信号。这些我还没接触。。。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21776.html
摘要:因为子进程一定不会是组长进程,所以子进程可以调用。主进程退出子进程继续执行啦啦啦,啦啦啦,啦啦啦,已经变成啦,开心一般服务器软件都有写配置项,比如以模式运行还是以模式运行。 [原文地址:https://blog.ti-node.com/blog...] 其实前面是谈过一次daemon进程的,但是并涉及过多原理,但是并不影响使用。今天打算说说关于daemon进程更多的二三事,本质上说,如...
摘要:本节主要讲解常用函数和进程池的概念,也会涉及到守护进程的知识。所以任何时候,建议预先创建好进程,也就是使用进程池的方式实现。 本节主要讲解Posix常用函数和进程池的概念,也会涉及到守护进程的知识。本节难度较低。 Posix常用函数 posix_kill 向指定pid进程发送信号。成功时返回 TRUE , 或者在失败时返回 FALSE 。 bool posix_kill ( int $...
摘要:后面每开启一个子进程,会将子进程的存储到中,用来后面主进程监控子进程,如果子进程意外终止,主进程可以重新佛。将当前子进程设置为会话组再次创建子进程,为了防止在的系统下重新打开控制终端。 wokerman 启动分析 @(学习)[workerman, php] 前期想说的 也是最近才看的代码,遇到不懂得地方就去google,所以这篇文章里面穿插了很多参考资料,可以直接点击阅览。 需要了解一...
摘要:守护进程常常在系统引导装入时启动,在系统关闭时终止。进程组有进程组来唯一标识。且该进程组不会因组长进程的退出而受到影响。 使用函数 pcntl_fork();//创建子进程 posix_setsid();//设置当前进程为进程组长 posix_getpid();//获取进程id 例子 workerman中将进程 /** * Run as deamon mode. * * @th...
阅读 1221·2021-10-11 10:57
阅读 2014·2021-09-02 15:15
阅读 1556·2019-08-30 15:56
阅读 1161·2019-08-30 15:55
阅读 1118·2019-08-30 15:44
阅读 949·2019-08-29 12:20
阅读 1246·2019-08-29 11:12
阅读 1035·2019-08-28 18:29