守护进程可

  • 由系统启动脚本 /etc/rc.local
  • crontab任务,
  • 用户shell

    方式运行

具体概念可参考c的

进程守护化基本步骤

  • 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守护进程创建和简要分析的更多相关文章

  1. Linux 守护进程创建原理及简易方法

    1:什么是Linux下的守护进程 Linux daemon是运行于后台常驻内存的一种特殊进程,周期性的执行或者等待trigger执行某个任务,与用户交互断开,独立于控制终端.一个守护进程的父进程是in ...

  2. Linux 守护进程创建

    1. 守护进程: 是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.守护进程常常在系统启动时开始运行,在系统关闭时终止 2. ...

  3. Windows进程创建的流程分析

    .   创建进程的大体流程:   创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等). 构建这个环境需要两种"人"来协调完成(用户态和内核 ...

  4. linux 守护进程创建流程

    #include <sys/stat.h> #include <fcntl.h> /* Bit-mask values for 'flags' argument of beco ...

  5. linux 创建守护进程的相关知识

    linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...

  6. Linux之守护进程

    一.守护进程概述 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进 程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一 ...

  7. UNIX环境高级编程——守护进程

    一.守护进程简介 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系 ...

  8. Linux 下Qt实现守护进程实例(转)

     原文地址:Linux守护进程的编程方法(含实例) 作者:lingdxuyan 参考文献 Linux信号列表(zz) Linux 守护进程的编程方法 linux上编写守护进程的例程 Linux下后台守 ...

  9. linux守护进程编写实践

    主要参考:http://colding.bokee.com/5277082.html (实例程序是参考这的) http://wbwk2005.blog.51cto.com/2215231/400260 ...

随机推荐

  1. ASP.NET CORE(C#)与Spring Boot MVC(JAVA)

    干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结   目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方 ...

  2. UMl类图基本认识

    1.基本认识 1) UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2) ...

  3. Eclipse+TestNG搭建接口自动化测试框架

    一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不再详细介绍. 资源分享链接:http://pan.baidu.com/s/1v9Fw6 2.安装Tes ...

  4. 【作业】Mental Rotation (模拟)

    题目链接:https://vjudge.net/contest/345791#problem/L [问题描述] Mental rotation is a difficult thing to mast ...

  5. 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS

    作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...

  6. RHEL 6.5 安装Docker

    一,配置远程yum源二,下载依赖包1.安装downloadonly插件使用yum下载rpm包2.下载docker需要的依赖包三,安装docker(离线节点)1. 依次执行docker的安装包2. 启动 ...

  7. Python--类的定义与使用

    转载自https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200407 ...

  8. 基于UDP的编程

    前提:基于Linux系统的学习 服务器端编程模型1 socket(2) 创建通讯端点,返回一个文件描述符fd2 bind(2) 将fd绑定到本地的地址和端口while(1){ 阻塞等待客户端请求数据的 ...

  9. PowerBuilder学习笔记之打开Expressino属性页

  10. Ajax跨越请求失败,解决

    跨越请求 1.1什么是跨域(两个不同系统之间的访问.调用) (1)域名不同,即两个不同的应用. (2)域名相同,但是端口不同,即同一个应用中的不同子系统. 1.2 Ajax跨域请求的缺陷 (1)创建t ...