百度不收录你的网站产品,在线代理访问网页,徐州数据网站建设介绍,wordpress 30分钟过期守护进程原理及Python实现守护进程#xff0c;不依赖于终端#xff0c;在后台运行的程序#xff0c;通常称为daemon(ˈdiːmən或ˈdeɪmən)。一些常见的Linux软件通常都是已守护进程的方式运行#xff0c;比如#xff1a;nginxredismemcached守护进程的原理#xff1a;…守护进程原理及Python实现守护进程不依赖于终端在后台运行的程序通常称为daemon(ˈdiːmən或ˈdeɪmən)。一些常见的Linux软件通常都是已守护进程的方式运行比如nginxredismemcached守护进程的原理通过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即可操作相关进程。示例代码中的“进程注册信号处理方式”就是用来响应信号量的守护进程可以针对不同的信号做出不同的反应。