守护进程可

  • 由系统启动脚本 /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. Apache Flink SQL

    本篇核心目标是让大家概要了解一个完整的 Apache Flink SQL Job 的组成部分,以及 Apache Flink SQL 所提供的核心算子的语义,最后会应用 TumbleWindow 编写 ...

  2. 使用mybatis完成增删改查

    插入 插入数据 <insert id="insertUser2" parameterType="UserEntity"> insert into u ...

  3. Linux基础-03-用户、群组

    1. 用户及passwd文件 1) /etc/passwd文件的功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database). 2) /etc/passwd文件每个字段的具体含义: ...

  4. golang使用一个二叉树来实现一个插入排序

    思路不太好理解,请用断点 package main import "fmt" type tree struct { value int left, right *tree } fu ...

  5. AVR单片机教程——开发板介绍

    本教程使用EasyElectronics开发板: EasyElectronics是一款基于AVR单片机的开发板.AVR单片机是基于改进的哈佛架构.8~32位的一系列RISC微控制器,最初由Atmel公 ...

  6. 机器学习之主成分分析PCA原理笔记

    1.    相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...

  7. AJAX个人草稿

    /*var CUSTOMS_SEX=arr[2]; var CUSTOMS_TELEPHONE=arr[6]; mui.openWindow({ url:'userinfol.html', id:'u ...

  8. Android--单选对话框

    import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterfa ...

  9. 题解-CSA Beta Round#1 Number Elimination

    Problem CSA-Beta Round#3 题意概要:给定 \(n\) 个数组成的序列,定义一次操作: 在当前序列中选择两个数,将其中较小的数从序列中删除(若两个数相同,则删除在序列中更靠前的) ...

  10. SpinWait 第二篇

    SpinWait 提供了两个方法和两个只读属性. 方法: SpinWait.Reset() : 重置自旋计数器,将计数器置 0.效果就好像没调用过SpinOnce一样.SpinWait.Once() ...