php守护进程创建和简要分析
守护进程可
- 由系统启动脚本 /etc/rc.local
- crontab任务,
- 用户shell
方式运行
进程守护化基本步骤
- 1.创建子进程,终止父进程 (pcntl_fork,exit)
- 2.在子进程中创建新会话 (posix_setsid)
- 3.改变工作目录(默认继承了父进程的当前工作目录) (chdir('/'))
- 4.重设文件掩码(默认继承了父进程的) (umask(0) 改变当前的umask为最宽松掩码)
- 5.关闭文件描述符(默认继承了父进程打开的文件描述符) (fclose 关闭已打开的文件描述符)
daemon.php
<?php
echo posix_getpid().PHP_EOL;
$childs = [];
$worker_num = 3;
//daemon();
for ($i = 0; $i < $worker_num; $i++) {
fork();
}
while (count($childs)) {
if (($exit_id = pcntl_wait($status)) > 0) {
$signo = pcntl_wtermsig($status);
unset($childs[$exit_id]);
}
if (count($childs) < $childs) {
fork();
}
}
function daemon()
{
$pid = pcntl_fork();
if ($pid < 0) die("fork err");
if ($pid == 0) {
if (posix_setsid() <= 0) {
die("setsid err!");
}
if (chdir('/') === false) {
die("change dir err");
}
umask(0);
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
} else {
exit();
}
}
function fork()
{
global $childs;
$pid = pcntl_fork();
if ($pid < 0) die("fork err");
if ($pid == 0) {
$child_pid = posix_getpid();
while (true) {
sleep(10);
}
} else {
$parent_pid = posix_getpid();
$childs[$pid] = $pid;
}
}
分析
不执行daeon函数时
[root@hkui ~]# pstree -p|grep php
|-sshd(3169)-+-sshd(10101)---bash(10103)---php(10609)-+-php(10610)
| | |-php(10611)
| | `-php(10612)
[root@hkui ~]# ps --sid 10103 -o pid,ppid,pgid,sid
PID PPID PGID SID
10103 10101 10103 10103
10609 10103 10609 10103
10610 10609 10609 10103
10611 10609 10609 10103
10612 10609 10609 10103
[root@hkui ~]# ps --pid 10101 -o pid,ppid,pgid,sid
PID PPID PGID SID
10101 3169 10101 10101
[root@hkui ~]# ps --pid 3169 -o pid,ppid,pgid,sid
PID PPID PGID SID
3169 1 3169 3169
------------------------------------------------------------------------
bash(10103)和它创建的子进程们(10606,10610,10611,10612)属于同一个会话期
sid为bash的进程号,所以bash为创建该会话的首进程
bash为一个进程组 10103
bash创建的php进程为一个进程组
这两个进程组同属一个会话期
程序daemon.php运行时创建了进程组10609,它即为组长
执行了daemon()
输出
10563
[root@hkui ~]# pstree -p|grep php
|-php(10564)-+-php(10565)
| |-php(10566)
| `-php(10567)
[root@hkui ~]# ps --sid 10564 -o pid,ppid,pgid,sid
PID PPID PGID SID
10564 1 10564 10564
10565 10564 10564 10564
10566 10564 10564 10564
10567 10564 10564 10564
执行了daemon.php后,程序运行起来了,进程id为10563
在10563里fork一次,得到子进程10564,父进程10563退出
子进程10564里执行setsid后发生了主要的以下三件事
1.10564创建了新的进程组,自己升级为组长
2.10564创建了新的会话组,并成为该会话组的会话首进程
3.10564和控制终端失去联系
由于其父进程10563退出,它的父进程变为init进程
在10564里fork了3个子进程,继承了10564的组Id,会话Id
php守护进程创建和简要分析的更多相关文章
- Linux 守护进程创建原理及简易方法
1:什么是Linux下的守护进程 Linux daemon是运行于后台常驻内存的一种特殊进程,周期性的执行或者等待trigger执行某个任务,与用户交互断开,独立于控制终端.一个守护进程的父进程是in ...
- Linux 守护进程创建
1. 守护进程: 是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.守护进程常常在系统启动时开始运行,在系统关闭时终止 2. ...
- Windows进程创建的流程分析
. 创建进程的大体流程: 创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等). 构建这个环境需要两种"人"来协调完成(用户态和内核 ...
- linux 守护进程创建流程
#include <sys/stat.h> #include <fcntl.h> /* Bit-mask values for 'flags' argument of beco ...
- linux 创建守护进程的相关知识
linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...
- Linux之守护进程
一.守护进程概述 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进 程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一 ...
- UNIX环境高级编程——守护进程
一.守护进程简介 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系 ...
- Linux 下Qt实现守护进程实例(转)
原文地址:Linux守护进程的编程方法(含实例) 作者:lingdxuyan 参考文献 Linux信号列表(zz) Linux 守护进程的编程方法 linux上编写守护进程的例程 Linux下后台守 ...
- linux守护进程编写实践
主要参考:http://colding.bokee.com/5277082.html (实例程序是参考这的) http://wbwk2005.blog.51cto.com/2215231/400260 ...
随机推荐
- [转帖]Red Hat K8s 关键人物 Grant Shipley 跳槽到 VMware
Red Hat K8s 关键人物 Grant Shipley 跳槽到 VMware https://news.cnblogs.com/n/641944/ 这四小时的工作效率 太无敌了.. 投递人 ...
- k8s ingres 的安装与使用
1. 安装. 从ingress的官网下载yaml文件. https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy ...
- JWT知识整理
JSON Web Token:(https://jwt.io/) JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-co ...
- C++ 用 new 生成一个动态二维数组
//Microsoft Visual Studio 2015 Enterprise //变长二维数组 #include <iostream> #include<iomanip> ...
- fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
在PHP的日常开发中,时常会需要导出 excel ,一般我们会使用 PHPExcel ,性能强大,但是在数据量大的时候,phpexcel 性能差.内存溢出等各种不可控问题就会出现.因此,如果对导出样式 ...
- Python-21-socket编程
一.基础知识 1. C/S架构 C/S架构即客户机/服务器模式. 它可以分为客户机和服务器两层: 第一层: 在客户机系统上结合了界面显示与业务逻辑: 第二层: 通过网络结合了数据库服务器. 简单的 ...
- Python后台执行不启用缓存
1.运行时加-u参数,如 # python3 -u test.py >> test.log & 用man查看python的-u参数,说明如下: Force stdin, stdou ...
- 在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
原文:在论坛中出现的比较难的sql问题:28(循环查询表来实现递归) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...
- ajax提交异常解决
一.遇到的问题 在项目中使用ajax提交表单失败,并且后台程序都没有执行,分析具体问题是由于post表单时contenttype的类型不一致. 二.解决方式 $.ajax({ type: 'post' ...
- "多层感知器"--MLP神经网络算法
提到人工智能(Artificial Intelligence,AI),大家都不会陌生,在现今行业领起风潮,各行各业无不趋之若鹜,作为技术使用者,到底什么是AI,我们要有自己的理解. 目前,在人工智能中 ...