>  기사  >  백엔드 개발  >  데몬이란 무엇입니까? PHP에서 데몬을 구현하는 방법은 무엇입니까?

데몬이란 무엇입니까? PHP에서 데몬을 구현하는 방법은 무엇입니까?

青灯夜游
青灯夜游앞으로
2021-06-23 20:30:302749검색

데몬은 백그라운드에서 실행되며 특정 시스템 작업을 수행하는 데 사용되는 특수 프로세스입니다. 이 글에서는 PHP에서 데몬을 구현하는 방법과 프로그래밍 시 주의해야 할 사항을 소개합니다.

데몬이란 무엇입니까? PHP에서 데몬을 구현하는 방법은 무엇입니까?

PHP 구현 데몬은 pcntlposix 확장을 통해 구현할 수 있습니다. pcntlposix 扩展实现。

编程中需要注意的地方有:

  • 通过二次 pcntl_fork() 以及 posix_setsid 让主进程脱离终端
  • 通过 pcntl_signal() 忽略或者处理 SIGHUP 信号
  • 多进程程序需要通过二次 pcntl_fork() 或者 pcntl_signal() 忽略 SIGCHLD 信号防止子进程变成 Zombie 进程
  • 通过 umask() 设定文件权限掩码,防止继承文件权限而来的权限影响功能
  • 将运行进程的 STDIN/STDOUT/STDERR 重定向到 /dev/null 或者其他流上

如果要做的更好,还需要注意:

  • 如果通过 root 启动,运行时更换到低权限用户身份
  • 及时 chdir() 防止操作错误路径
  • 多进程程序考虑定时重启,防止内存泄露

什么是daemon

文章的主角守护进程(daemon),Wikipedia 上的定义是:

在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。
通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程运行fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳”。

UNIX环境高级编程(第二版)(以下使用简称 APUE 指代) 13章有云:

守护进程也成精灵进程( daemon )是生存周期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。因为他们没有控制终端,所以说他们是在后台运行的。

这里注意到,daemon有如下特征:

  • 没有终端
  • 后台运行
  • 父进程 pid 为1

想要查看运行中的守护进程可以通过 ps -ax 或者 ps -ef 查看,其中 -x 表示会列出没有控制终端的进程。

实现关注点

二次 fork 与 setsid

fork 系统调用

fork 系统调用用于复制一个与父进程几乎完全相同的进程,新生成的子进程不同的地方在于与父进程有着不同的 pid 以及有不同的内存空间,根据代码逻辑实现,父子进程可以完成一样的工作,也可以不同。子进程会从父进程中继承比如文件描述符一类的资源。

PHP 中的 pcntl 扩展中实现了 pcntl_fork() 函数,用于在 PHP 中 fork 新的进程。

setsid 系统调用

setsid 系统调用则用于创建一个新的会话并设定进程组 id。

这里有几个概念:会话进程组

在 Linux 中,用户登录产生一个会话(Session),一个会话中包含一个或者多个进程组,一个进程组又包含多个进程。每个进程组有一个组长(Session Leader),它的 pid 就是进程组的组 id。进程组长一旦打开一个终端,这一个终端就被称为控制终端。一旦控制终端发生异常(断开、硬件错误等),会发出信号到进程组组长。

后台运行程序(如 shell 中以&结尾执行指令)在终端关闭之后也会被杀死,就是没有处理好控制终端断开时发出的SIGHUP信号,而SIGHUP

프로그래밍에서 주의해야 할 사항은 다음과 같습니다. 🎜
  • 두 번째 pcntl_fork()posix_setsid를 사용하여 주요 프로세스를 가져옵니다. 터미널
  • pcntl_signal()을 통해 SIGHUP 신호를 무시하거나 처리합니다.
  • 다중 프로세스 프로그램은 를 두 번 전달해야 합니다. >pcntl_fork() 또는 pcntl_signal() SIGCHLD 신호를 무시하여 하위 프로세스가 좀비 프로세스가 되는 것을 방지합니다.
  • 파일 설정 파일 권한에서 상속된 권한이 기능에 영향을 미치지 않도록 umask()를 통한 권한 마스크
  • 실행 중인 프로세스의 STDIN/STDOUT/STDERR를 다음으로 리디렉션합니다. /dev/null 또는 기타 스트리밍
🎜더 나은 결과를 원한다면 다음 사항에도 주의를 기울여야 합니다. 🎜
  • 루트를 통해 시작하는 경우 , 실행할 때 낮은 권한의 사용자 ID로 변경
  • 적시에 chdir() 작업 오류 방지
  • 메모리 누수를 방지하려면 다중 프로세스 프로그램을 정기적으로 다시 시작하는 것이 좋습니다
🎜🎜

데몬이란 무엇입니까

🎜기사의 주인공 데몬 Wikipedia의 정의는 다음과 같습니다. 🎜
🎜멀티태스킹 컴퓨터 운영 체제에서 데몬(영어: daemon, /ˈdiːmən/ 또는 /ˈdeˈdeˈmən/)은 백그라운드에서 실행되는 컴퓨터 프로그램입니다. 이러한 프로그램은 프로세스로 초기화됩니다. 데몬 프로그램의 이름은 일반적으로 문자 "d"로 끝납니다. 예를 들어 syslogd는 시스템 로그를 관리하는 데몬을 나타냅니다.
일반적으로 데몬 프로세스에는 기존 상위 프로세스(즉, PPID=1)가 없으며 UNIX 시스템 프로세스 계층에서 init 바로 아래에 있습니다. 데몬 프로그램은 일반적으로 하위 프로세스에서 포크를 실행한 다음 하위 프로세스가 init에서 실행될 수 있도록 상위 프로세스를 즉시 종료하여 자체적으로 데몬을 만듭니다. 이 방법을 흔히 "쉘링"이라고 합니다. 🎜
🎜UNIX 환경의 고급 프로그래밍(제2판)(이하 약어) APUE가 사용함) 13장에 🎜
🎜 데몬 프로세스도 데몬 프로세스(daemon)인데, 수명주기가 긴 프로세스라고 하네요. 시스템이 부팅될 때 시작되고 시스템이 종료될 때만 종료되는 경우가 많습니다. 제어 터미널이 없기 때문에 백그라운드에서 실행된다고 합니다. 🎜
🎜데몬은 다음과 같은 특징을 가지고 있습니다: 🎜

위 내용은 데몬이란 무엇입니까? PHP에서 데몬을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제