问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python写一个后台的守护进程

发布网友 发布时间:2022-05-02 00:13

我来回答

2个回答

懂视网 时间:2022-04-18 13:02

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。

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

守护进程的编写步骤:

1、fork子进程,然后父进程退出,此时子进程会被init进程接管。
2、修改子进程的工作目录,创建新进程组合新会话,修改umask。
3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。
4、重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null
完成上面的4个步骤,那么最终的孙子进程就称为守护进程,先看下代码,后面分析下步骤的原因。

#!/usr/bin/env python
#coding=utf8
def createDaemon():
 import os, sys, time
 #产生子进程,而后父进程退出
 try:
 pid = os.fork()
 if pid > 0:sys.exit(0)
 except OSError,error:
 print 'fork'
 sys.exit(1)
 
 #修改子进程工作目录
 os.chdir("/")
 #创建新的会话,子进程成为会话的首进程
 os.setsid()
 #修改工作目录的umask
 os.umask(0)
 
 #创建孙子进程,而后子进程退出
 try:
 pid = os.fork()
 if pid > 0:
 print "Daemon PID %d"%pid
 sys.exit(0)
 except OSError,error:
 print "fork"
 sys.exit(1)
 run()
 
 
def ping():
 import os
 os.system('ping www.baidu.com >/dev/nul')
 
def run():
 while True:
 import time,threading
 fd = open('/home/ping.log', 'a')
 fd.write("start time---------:%s
"%time.ctime())
 fd.flush()
 t=threading.Thread(target=ping,args=())
 t.start()
 time.sleep(3)
 fd.write("end of time--------:%s
"%time.ctime())
 fd.flush()
 fd.close()
 
if __name__=='__main__':
 createDaemon()

1、fork子进程,父进程退出
通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被init进程接管,从而也就脱离了终端控制。
2.修改子进程的工作目录
子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。
3.创建新会话
使用setsid后,子进程就会成为新会话的首进程,子进程会成为新进程组的组长进程,子进程没有控制终端。
4.修改umask
由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题
5.fork孙子进程,子进程退出
经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题,fork孙子进程处理,
6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null
因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到/dev/null,就是丢弃的意思

我们来运行一个这个程序,看看效果

python daemon守护进程实现

从上图可以看出这个脚本程序已经放入后台,只能使用killall方式来结束掉,
接下来我们去看下记录的日志

python daemon守护进程实现

更多python daemon守护进程实现相关文章请关注PHP中文网!

热心网友 时间:2022-04-18 10:10

import os,sys,commands,time

def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    """set daemonize """
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
    except OSError, e:
        sys.stderr.write("fork #1 failed (%d) %s\n " %(e.errno, e.strerror))
        sys.exit(0)

    os.setsid()
    os.chdir('.')
    os.umask(0)

    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
    except OSError, e:
        sys.stderr.write("fork #2 failed (%d) %s\n " %(e.errno, e.strerror))
        sys.exit(0)

    if not stderr: stderr = stdout
    si = file(stdin, "r")
    so = file(stdout, "w+")
    se = file(stderr, "a+")
    pid = str(os.getpid())
    print "start with pid :[%s]" % pid
    fp = open("pid","w")
    print >> fp, pid
    fp.close()
    sys.stderr.flush()

    sys.stdout.flush()
    sys.stderr.flush()
    os.p2(si.fileno(), sys.stdin.fileno())
    os.p2(so.fileno(), sys.stdout.fileno())
    os.p2(se.fileno(), sys.stderr.fileno())

def main():
    daemonize(stdout='test.log', stderr='test.log')
    
    cmd = "ls" 
    while 1:
        (status, ret) = commands.getstatusoutput(cmd)
        print status
        print ret      
        time.sleep(10)

if __name__ == "__main__":
    main()

你可以尝试照这个写写,基本的元素都齐了,后台运行,执行shell命令

不过如果只是想要后台的话,直接shell后台执行一下也就可以了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你好。本人最近想入手个 本本 知道你是高手望给点高见 3K以内。 惠普(hp)hp431(qg643pa) 与联想(lenovo)g460al-ith(h)该买哪一... 惠普4核1G独立显卡2G-4G内存的笔记本电脑有哪些型号的比较好?价位是多... hp 431-qg597怎么样?惠普质量真很差吗?它的商务本怎么样 hp431 qg597无线上网卡插在那里? 惠普HP431(QG643PA)笔记本经常死机自动重启 陆金所 德众金融理财可靠吗? 平安为什么建陆金所 陆金所有什么风险吗 100分问题:请问汕头市区哪里有卖“节节风”的中草要。 三星49寸曲面显示器买了五个月就烧屏坏了,请问怎样处理或怎样维权? 我想用python的强化学习算法实时控制simulink中pid模型,该怎么做呢? 明天的明天是后天,那后天的明天叫什么啊?四川话里面的万后天是四川哪个市的方言? 49英寸电视机哪个牌子好,比价选购 后天的后天叫大后天还是后天的明天叫大后天 昨日,今日,明日,再往后一日称呼什么日?怎么表示一个节气来临的后二日? 明天、后天、大后天、大后天的明天是什么? 海信49寸曲屏5600UC屏幕一条横线是屏问题吗? 请问我的支付宝完成实名认证了,而且还上传了身份证证件,完成了这两个步骤我的支付宝限额是多少啊? 神经网络自整定PID真的有效吗?我看图书馆的参考书上和知网论文上的方法,感觉推导过程都不对啊? 酷我音乐下的音乐怎么存到内存卡里? 华为手环6和7表带通用吗? 包羊肉汤放一些什么菜 羊肉清汤可以放哪些菜一起煮 已婚女士梦到被狼还有猪追着咬,无奈之下只好爬到了一颗大树上面,这什么意思 吃香蕉到底会不会胖啊?快快告诉我啦 吃香蕉会不会长胖啊 减肥的时候吃香蕉会胖吗,多吃会胖吗 吃香蕉会变胖吗 吃香蕉会不会发胖 明天的明天叫什么 明天的明天的明天叫什么? "后天"(明天的明天)在台湾叫什么 今天 昨天 后天 大后天 在后面是什么 002685华东重机的股权登记日是什么时候 用什么电竞显示器能释放RTX 3080显卡的性能?华硕的可以吗? 求计算算法的复杂度 (Python写的逻辑) 长虹50英寸D3P直屏与TCL49英寸950C曲面屏哪个好 明天的明天的明天怎么叫? 在台湾明天的明天叫什么?就是大陆所说的“后天” 台湾人叫明天的明天叫做什么 玄龙骑士G9开启PBP只有60hz去年8月的产品三星玄龙骑士G9240hz的1000R曲面屏49英_百度问一问 我想问一下 明天的明天叫什么啊? 无锡华东重型机械股份有限公司的介绍 日发精机利好新消息?日发精机2021年中报?日发精机股票的发行价是多少? 不同曲面显示器品牌是不是尺寸都不一样?! 泰坦军团C49S pro用的是R1800的曲面,49寸用了R1800屏会不会曲率太大呢? 日发精机股票现在怎么样?日发精机主力大幅流入股价为何不涨?日发精机怎么分红怎么算? 后天的后天叫什么 佳能6D与70D的选择?