守护进程原理及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,即可操作相关进程。示例代码中的“进程注册信号处理方式”就是用来响应信号量的,守护进程可以针对不同的信号,做出不同的反应。

python实现守护进程_守护进程原理及Python实现相关推荐

  1. python迭代算法含义_迭代算法原理及其Python编程实现

    黄旭 摘 要:迭代算法是数学算法在计算机中应用的一个热点,也是计算机解决问题的一般思路,本文结合数学中二分法求根的原理,阐述了数学迭代算法的一般原理,并采用了Python加以实现,为进一步对数学算法理 ...

  2. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  3. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

  4. vmware-vmx.exe无法结束进程_孤儿进程与僵尸进程产生原理分析,以及终极解决方案案例实现...

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  5. 卡住无法查看到所有进程_进程同步 进程互斥 软件和硬件实现方式 信号量机制 信号量机制实现进程同步,进程互斥,前驱关系...

    参考:https://www.bilibili.com/video/av31584226/?p=9 进程具有异步性的特征,异步性是指,各并发执行的进程以各自独立的,不可预知的速度向前推进. 回忆我们之 ...

  6. python实现逻辑回归的流程_逻辑回归原理及其python实现

    September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...

  7. java 僵尸进程_孤儿进程与僵尸进程

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  8. python解析原理_主成分分析法原理及其python实现

    主成分分析法原理及其python实现 前言: 这片文章主要参考了Andrew Ng的Machine Learning课程讲义,我进行了翻译,并配上了一个python演示demo加深理解. 本文主要介绍 ...

  9. python常用面试题_史上最全Python工程师常见面试题集锦,有这一份就够了

    从互联网诞生以来,基本上所有的程序都属于网络程序,也就需要设计到网络编程,在python中,就是在python程序本身这进程内,链接别的服务器进程的通信端口进行通信.在Python程序员找工作的时候, ...

最新文章

  1. 大脑如何判断该睡觉了?可能是这80种蛋白说了算
  2. 对C语言中递归算法的分析
  3. 产品经理利器之axure rp
  4. 近期值得读的10篇GAN进展论文
  5. 30 个 OpenStack 经典面试问题和解答
  6. 181. maven项目ssm(父工程 子工程)
  7. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
  8. C语言版iso8583报文拆包组包代码
  9. 前向传播、反向传播——通俗易懂
  10. linux进程tss和ldt,x86体系下linux中的任务切换与TSS
  11. 2019ug最新版本是多少_宝塔Linux面板7.4.2版本/Windows面板6.8版本请尽快升级到最新版本...
  12. [HAOI2011]problem a
  13. 如何在TP-LINk WR340G中禁用端口
  14. Div 在页面中居中
  15. html加载gif动画效果,html – 使用CSS动画加载图像VS使用GIF图像加载
  16. linux中telnet命令安装包,linux的telnet命令安装
  17. 怀旧系列(2)----FoxBase,UCDOS,WPS
  18. Shiro框架Given final block not properly padded问题解决
  19. YAML详解 是什么
  20. bte上了b网_酷站推荐 - tukkk.com - 小语种口语网

热门文章

  1. 声音均衡器怎么调好听_汽车10段音效最佳设置,手把手教你调节车载音响均衡器...
  2. linux修改密码最短生存时间,Linux基础命令---修改用户密码
  3. 192.168.8.1手机登陆_高端机型都在鼓吹的ufs3.1是什么?对于手机使感受明显吗?...
  4. mysql字符串语法_MySQL语法模板 函数:字符串
  5. matlab 微秒 符号,matlab处理csi
  6. Java 设置文件只读
  7. linux mysql 8安装教程,MySQL8系列安装与配置教程(Linux环境)
  8. mysql命令行cmd_CMD命令行操作MySQL
  9. 全数字实时仿真平台SkyEye经典案例——空间站项目
  10. 两步路轨迹文件位置_最新Uber ATG的轨迹预测方法LiRaNet介绍