Linux运维知识之linux下python守护进程编写和原理理解
小标 2019-01-16 来源 : 阅读 983 评论 0

摘要:本文主要向大家介绍了Linux运维知识之linux下python守护进程编写和原理理解,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。

本文主要向大家介绍了Linux运维知识之linux下python守护进程编写和原理理解,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。

编写了一个服务端程序,打开终端能直接运行程序,但是这样终端就被限制住了。如果ctrl+c退出或者关闭终端,那么服务端程序就会退出。于是就想着让这个服务端程序成为守护进程,像httpd、vsftpd、mysqld一样,一直在后端运行,不会受终端的影响。


守护进程英文为daemon,像httpd、mysqld、vsftpd最后个字母d其实就是表示daemon的意思。


守护进程的编写步骤:



fork子进程,而后父进程退出,此时子进程会被init进程接管。


修改子进程的工作目录、创建新进程组和新会话、修改umask。


子进程再次fork一个进程,这个进程可以称为孙子进程,而后子进程退出。


重定向孙子进程的标准输入流、标准输出流、标准错误流到/dev/null。



完成上面的4个步骤,那么最终的孙子进程就称为守护进程。先看下代码,后面再分析下每个步骤的原因。


#!/usr/bin/env python
#coding=utf8

import os, sys, time

#产生子进程,而后父进程退出
pid = os.fork()
if pid > 0:
    sys.exit(0)

#修改子进程工作目录
os.chdir("/")
#创建新的会话,子进程成为会话的首进程
os.setsid()
#修改工作目录的umask
os.umask(0)

#创建孙子进程,而后子进程退出
pid = os.fork()
if pid > 0:
    sys.exit(0)

#重定向标准输入流、标准输出流、标准错误
sys.stdout.flush()
sys.stderr.flush()
si = file("/dev/null", 'r')
so = file("/dev/null", 'a+')
se = file("/dev/null", 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

#孙子进程的程序内容
while True:
    time.sleep(10)
    f = open('/home/test.txt', 'a')
    f.write('hello')


上面的程序没有任何错误处理,但是不影响原理分析。如果要应用到项目里,还需完善。下面笔者谈下自己对每个步骤的理解。


1、fork子进程,父进程退出


通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到。在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响。在程序里fork子进程后,父进程退出,对了shell进程来说,这个父进程就算执行完了,而产生的子进程会被init进程接管,从而也就脱离了终端的控制。


2、修改子进程的工作目录


子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在u盘里的,就会导致u盘不能卸载。


3、创建新会话


使用setsid后,子进程就会成为新会话的首进程(session leader);子进程会成为新进程组的组长进程;子进程没有控制终端。


4、修改umask


由于umask会屏蔽权限,所以设定为0,这样可以避免读写文件时碰到权限问题。


5、fork孙子进程,子进程退出


经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题,fork孙子进程出来。


6、重定向孙子进程的标准输入流、标准输出流、标准错误流到/dev/null


因为是守护进程,本身已经脱离了终端,那么标准输入流、标准输出流、标准错误流就没有什么意义了。所以都转向到/dev/null,就是都丢弃的意思。

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注系统运维Linux频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程