python实现守护进程_守护进程原理及Python实现

守护进程原理及Python实现

守护进程,不依赖于终端,在后台运行的程序,通常称为daemon(ˈdiːmən或ˈdeɪmən)。

一些常见的Linux软件通常都是已守护进程的方式运行,比如:

nginx

redis

memcached

守护进程的原理:

通过fork() 复刻出子进程,并通过setsid()创建新会话,成为会话首领;同时结束原来的父进程,使得复刻出来的子进程脱离终端而运行。

守护进程Python代码实现:

def daemon_start(self):

try:

# 第1次fork,并结束父进程

pid = os.fork()

if pid > 0:

sys.exit(0)

except Exception as e:

sys.exit(1)

# 创建新会话,并成为会话首领

os.setsid()

os.chdir(self.workdir)

os.umask(self.umask)

try:

# 第2次fork,结束当前这个子进程,fork出来的孙子进程由于不是进程首领,无法再次获取终端(这里的子进程,孙子进程都是相对于最开始的那个初始进程而言)

pid = os.fork()

if pid > 0:

sys.exit(0)

except Exception as e:

sys.exit(1)

def handle_exit(signum, _):

sys.exit(0)

# 孙子进程注册信号处理方式

signal.signal(signal.SIGINT, handle_exit)

signal.signal(signal.SIGTERM, handle_exit)

signal.signal(signal.SIGHUP, signal.SIG_IGN)

# 孙子进程是守护进程,不存在标准输入输出,所以关闭。

sys.stdin.close()

核心函数说明:

os.fork(): 对进程进行复刻;值得特别注意的是fork之后,原来的进程并没有终止,而是继续存在,被成为父进程;也就是说,在fork成功后,一共会存在2个进程,1个是原来的进程,称为父进程,1个是新创建的进程,称为子进程。父进程和子进程都会从fork的位置开始继续向下执行,不同的是父进程中,得到的fork返回值为子进程的进程号,而子进程中得到的是0。通过这个返回值,就能判断哪个是父进程,哪个是子进程。以上这点值得特别注意,这与我们以往理解的程序执行逻辑完全不同。

os.setsid():创建新的会话,并成为会话首领。

os.chdir():修改当前工作目录路径,防止目录被移除导致守护进程异常。

os.umask():设置文件创建模式屏蔽字,使得创建文件不受系统默认权限的影响。

常见问题:

1.第1次fork子进程已经脱离终端,为什么还要第2次fork,第2次fork是否必须?

第2次fork并不是必须的,实际上,很多流行的开源软件的守护进程并没有进行第2次fork。第2次fork的目的在于防止第1次fork出来的进程再次获得终端,第2次fork后,产生的孙子进程不再是会话首领,也就没有再次获得终端的能力。

void daemonize(void) {

int fd;

if (fork() != 0) exit(0); /* parent exits */

setsid(); /* create a new session */

/* Every output goes to /dev/null. If Redis is daemonized but

* the 'logfile' is set to 'stdout' in the configuration file

* it will not log at all. */

if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {

dup2(fd, STDIN_FILENO);

dup2(fd, STDOUT_FILENO);

dup2(fd, STDERR_FILENO);

if (fd > STDERR_FILENO) close(fd);

}

}

2.进程已经脱离终端,如何让它停止或者重启?

每一个进程都有一个进程id,即pid,通常程序启动后,会把pid写入到/var/run/目录下的某个文件里,通过发送信号量给pid,即可操作相关进程。示例代码中的“进程注册信号处理方式”就是用来响应信号量的,守护进程可以针对不同的信号,做出不同的反应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python生成器迭代_二十、深入Python迭代器和生成器

「Author:Runsen」学习python的过程中,迭代器与生成器是绕不开的话题, 什么是迭代器和生成器呢?下面我们来了解一下什么是迭代。但在了解迭代器之前,首先需要知道什么是容器。容器正所谓:一切都是对象&…

批改网禁止粘贴怎么破_重大利好!教育部声明,要求家长批改作业等行为,发现一起严处一起...

前段时间,在江苏一位家长发布短视频,他在视频中怒喊:我就退出家长群怎么了!引起网上一阵热议起因是这位家长认为老师总是让家长帮忙批改作业,自己承担了太多教师应负的责任,完了还要昧着良心说老师你辛苦了…

mysql实验步骤_MySQL双方配置实验步骤

实验环境:两台MariaDB服务器,IP分别为: 172.16.2.16 和 172.16.2.17MariaDB的版本是5.5.36,使用二进制方式安装。已安装完成。/mydata/data 数据库文件存放目录/mydata/binlog/ 二进制日志文件存放位置/mydata/relaylog/ 中继日志…

mac 系统安装 eclipse 方法

经过好几天的折腾,终于在各种不靠谱的经验、说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看,下次安装…

python 检测文件更新失败_依赖错误,检测更新失败,提示这个

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼rickrick-PC:~$ sudo apt-get update && sudo apt-get dist-upgrade -y命中:2 https://store.chinauos.com/appstore eagle InRelease获取:1 http://uos.deepin.cn/uos eagle InRelease [20.1 kB]命中:3 http://uos.deepin…

mysql+nest+嵌套事务_MySQL——事务

事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致状态转换为另一种一致状态。关键词事务四大特性ACIDMySql事务隔离级别MVCC多版本并发控制实现方式运行过程MVCC解决了幻读?InnoDB解决幻读的方式事务的分类扁平事务Flat…

谈谈写程序与学英语(转载)

注: 本文的作者是宋劲杉,原文链接。 俗话说,没有金刚钻,就别揽瓷器活儿。套用到IT业,英语不行,就别做程序员。网上关于程序员学英语的文章不少,但我想谈谈我自己的看法。首先详细讨论一下为什么程序员离了英…

python 取日期_python取出所有的日期

python取出所有的日期>>> s "2020-09-09 we have a meeting">>> re.findall([0-9]{4}-[0-9]{2}-[0-9]{2},s)日期的比较2020-09-092020-09-10比较两个日期大小def compare_date(date1,date2) :#取出年,如果同一年#取出月,如…

python自动化和教程_《手把手教你》系列练习篇之2-python+ selenium自动化测试(详细教程)...

1. 简介今天我们还是继续练习练习基本功,各位小伙伴要耐住住性子,要耐得住寂寞啊,不要急躁,后面你会感谢你在前边的不断练习的。到后面也是检验你前边的学习成果的一次很好实践。本文介绍如何通过link text、partial link text、c…

JavaScript高级程序设计之函数表达式

函数表达式是JS中一个强大的特性,尤其是ES6支持Lamada表达式后,更是锦上添花。在前边的文章介绍中,曾经介绍过一种创建函数的方式,函数声明,对函数表达式也有简单介绍。这章将会对函数表达有更详细的介绍。 函数表达式…

异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...

前言WiFi出了故障,速度慢,信号不稳定,自己处理,除了重启路由器,也没有什么别的招了;好在这万能重启,差不多能解决一大半的小故障;那信号不好,速度慢,不稳定&a…

python输入输出代码_python基本输入输出代码示例

#!/usr/bin/env python# -*- coding: utf-8 -*-#输入与输出#str()与repr()for x in range(1, 11):print repr(x).rjust(2), repr(x*x).rjust(3),#逗号代表不换行print repr(x*x*x).rjust(4)#格式化输出for x in range(1, 11):print {0:2d} {1:3d} {2:4d}.format(x, x*x, x*x*x)…

linux运维、架构之路-HAProxy反向代理

一、HAProxy介绍 专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入,基于TCP和HTTP应用的代理软件,开源免费、快速并且可靠的…

java洗牌_java语言实现简单的洗牌,发牌

packagecom.java.lei.homework;importjava.util.Arrays;importjava.util.Random;public classPokerGame {//1.创建数组,用以存储扑克牌static String[] pokers new String[54];public static voidmain(String[] args) {//2.创建牌 所有的牌赋值到array数组中pokers…

CSS3 3D transform变换

transform的坐标是需要了解的特性。 我们的rotateX,rotateY,rotateZ,和translateX,translateY等都是基于相同的坐标系来定位的。 3D的坐标如下入所示: 3D transform中有下面这三个方法: rotateX( angle )rotateY( angle )rotateZ( angle )理解了这三个方…

vba结束本次循环进行下次_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA:办公自动化》,还是老规矩,看看我们走到哪里了。1.认识VBA:什么是VBA?2.这些掌握了,你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明,谁看谁明…

CefSharp 支持MP4

效果图: 下载链接:https://share.weiyun.com/d1e249ef5c56b4d909b2124dc2dd8902 创建Wpf项目引用 如下: 第一步:创建项目引用CefSharp 第二步:将DLL拷贝到运行项目的Debug下 第三步:项目平台设置32位 第四…

python定义字典列表_Python基础语法(四)—列表、元组、字典、集合、字符串

列表基本概念列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制;列表索引值以0为开始值,-1为从未尾的开始位置。列表可以使用操作符进行拼接,使用*表示重复。当列表元素增加或删除时…

ReentrantLock 分析

带着疑问去分析 ReentrantLock是如何实现锁管理的。ReentrantLock是如何实现重入的。ReentrantLock是如何实现公平锁与非公平锁。ReentantLock的公平锁为什么一般情况下性能都比公平锁查。ReentrantLock数据结构 ReentrantLock的底层是借助于AbstractQueuedSynchronizer实现的&…

v4l2 框架下如何设置分辨率_Linux下如何进行FTP设置

目录: 一、Redhat/CentOS安装vsftp软件二、Ubuntu/Debian安装vsftp软件一、Redhat/CentOS安装vsftp软件1.更新yum源yum update -y2.安装vsftpyum install vsftpd -y3.修改配置文件vi /etc/vsftpd/vsftpd.conf # 原有初始配置 local_umask022 dirmessage_enableYES x…