我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python守护进程daemon实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python守护进程daemon实现

1.1 守护进程

守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。

在这里,我们在Linux2.6内核的centos中,ps -ef |awk '{print $1"\t "$2"\t "$3"\t  "$8}'看到:PPID=0的进程有两个,分别是PID=1的/sbin/init进程和PID=2的[kthreadd]进程。

root@develop:~# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr16 ?        00:00:03 /sbin/init
root         2     0  0 Apr16 ?        00:00:00 [kthreadd]
root         3     2  0 Apr16 ?        00:00:00 [ksoftirqd/0]

其中,[kthreadd]为内核进程,由它fork出来的子进程都是内核进程,并且内核守护进程的名字出现在方括号中,对于需要在进程上下文执行工作但却不被用户层进程(init)上下文调用的每一个内核组件,通常有它自己的内核守护进程。
而对于init进程,它是一个由内核在引导装入时启动的用户层次的命令,属于用户级守护进程,主要负责启动各运行层次特定系统服务。这些服务通常是在它们自己拥有的守护进程的帮助下实现的。用户层守护进程缺少控制终端可能是守护进程调用了setsid的结果。大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。


守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。此外,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建屏蔽字等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。

1.2 守护进程的特性

1.在后台运行
2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
3.启动方式特殊,它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,可以由crond启动,还可以由用户终端(通常是shell)执行。
总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。


注意,所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端,终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端是守护进程调用了setsid的结果。除update以外的所有守护进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。最后,应当引起注意的是所有这些守护进程的父进程都是init进程。



详细参见: 《AdvancedProgrammingin The Unix Environment》Section 13.3 Page 583
1、调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)。如前所述,由继承得来的文件模式创建屏蔽字可能会被设置为拒绝权限。我们可以根据我们的具体需求设定特定的权限。
2、调用fork,然后使父进程exit。这样做,使得当我们以./的shell命令启动守护进程时,父进程终止会让shell认为此命令已经执行完毕,而且,这也使子进程获得了一个新的进程ID。此外,让父进程先于子进程exit,会使子进程变为孤儿进程,这样子进程成功被init这个用户级守护进程收养。
3、调用setsid创建一个新会话。这在setsid函数中有介绍,调用setsid,会使这个子进程成为(a)新会话的首进程,(b)成为一个新进程组的组长进程,(c)切断其与控制终端的联系,或者就是没有控制终端。至此,这个子进程作为新的进程组的组长,完全脱离了其他进程的控制,并且没有控制终端。
4、将当前工作目录更改为根目录(或某一特定目录位置)。这是为了保证守护进程的当前工作目录在一个挂载的文件系统中,该文件系统不能被卸载。
5、关闭不再需要的文件描述符。根据具体情况来定。
6、某些守护进程可以打开/dev/null使其具有文件描述符0、1、2,这使任何一个试图读标准输入、写标准输出或标准错误的库例程都不会产生任何效果。
7、忽略SIGCHLD信号
   这一步并非必须的,只对需要创建子进程的守护进程才有必要,很多服务器守护进程设计成通过派生子进程来处理客户端的请求,如果父进程不对SIGCHLD信号进行处理的话,子进程在终止后变成僵尸进程,通过将信号SIGCHLD的处理方式设置为SIG_IGN可以避免这种情况发生。
8、用日志系统记录出错信息
   因为守护进程没有控制终端,当进程出现错误时无法写入到标准输出上,可以通过调用syslog将出错信息写入到指定的文件中。该接口函数包括openlog、syslog、closelog、setlogmask,具体可参考13.4节出错记录。
9、守护进程退出处理
   当用户需要外部停止守护进程运行时,往往会使用 kill命令停止该守护进程。所以,守护进程中需要编码来实现kill发出的signal信号处理,达到进程的正常退出。


总结守护进程编程规则
1.在后台运行,调用fork ,然后使父进程exit
2.脱离控制终端,登录会话和进程组,调用setsid()使进程成为会话组长
3.禁止进程重新打开控制终端
4.关闭打开的文件描述符,调用fclose()
5.将当前工作目录更改为根目录。
6.重设文件创建掩码为0
7.处理SIGCHLD 信号

3.1 函数实现

#!/usr/bin/env python
# coding:utf-8
import os,sys,time

def daemon_init(stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'):
    sys.stdin = open(stdin,'r')
    sys.stdout = open(stdout,'a+')
    sys.stderr = open(stderr,'a+')
    try:
        pid = os.fork()
        if pid > 0:        #parrent
            os._exit(0)
    except OSError,e:
        sys.stderr.write("first fork failed!!"+e.strerror)
        os._exit(1)

    # 子进程, 由于父进程已经退出,所以子进程变为孤儿进程,由init收养
'''setsid使子进程成为新的会话首进程,和进程组的组长,与原来的进程组、控制终端和登录会话脱离。'''
    os.setsid()
'''防止在类似于临时挂载的文件系统下运行,例如/mnt文件夹下,这样守护进程一旦运行,临时挂载的文件系统就无法卸载了,这里我们推荐把当前工作目录切换到根目录下'''
    os.chdir("/")
'''设置用户创建文件的默认权限,设置的是权限“补码”,这里将文件权限掩码设为0,使得用户创建的文件具有最大的权限。否则,默认权限是从父进程继承得来的'''
    os.umask(0)

    try:
        pid = os.fork()     #第二次进行fork,为了防止会话首进程意外获得控制终端
        if pid > 0:
            os._exit(0)     #父进程退出
    except OSError,e:
        sys.stderr.write("second fork failed!!"+e.strerror)
        os._exit(1)

    # 孙进程
#   for i in range(3,64):  # 关闭所有可能打开的不需要的文件,UNP中这样处理,但是发现在python中实现不需要。
#       os.close(i)
    sys.stdout.write("Daemon has been created! with pid: %d\n" % os.getpid())
    sys.stdout.flush()  #由于这里我们使用的是标准IO,回顾APUE第五章,这里应该是行缓冲或全缓冲,因此要调用flush,从内存中刷入日志文件。

def main():
    print '========main function start!============' #在调用daemon_init函数前是可以使用print到标准输出的,调用之后就要用把提示信息通过stdout发送到日志系统中了
    daemon_init('/dev/null','/tmp/daemon.log','/tmp/daemon.err')    # 调用之后,你的程序已经成为了一个守护进程,可以执行自己的程序入口了
    time.sleep(10) #daemon化自己的程序之后,sleep 10秒,模拟阻塞


if __name__ == '__main__':
    main()


#!/usr/bin/env python 
#coding: utf-8 
import sys, os 
 
'''将当前进程fork为一个守护进程 
  注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 
  所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了 
''' 
 
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
   #重定向标准文件描述符(默认情况下定向到/dev/null) 
  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(1) 
 
   #从母体环境脱离 
  os.chdir("/") #chdir确认进程不保持任何目录于使用状态,否则不能umount一个文件系统。也可以改变到对于守护程序运行重要的文件所在目录 
  os.umask(0)  #调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。 
  os.setsid()  #setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。 
 
   #执行第二次fork 
  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(1) 
 
   #进程已经是守护进程了,重定向标准文件描述符 
 
  for f in sys.stdout, sys.stderr: f.flush() 
  si = open(stdin, 'r') 
  so = open(stdout, 'a+') 
  se = open(stderr, 'a+', 0) 
  os.dup2(si.fileno(), sys.stdin.fileno())  #dup2函数原子化关闭和复制文件描述符 
  os.dup2(so.fileno(), sys.stdout.fileno()) 
  os.dup2(se.fileno(), sys.stderr.fileno()) 
 
#示例函数:每秒打印一个数字和时间戳 
def main(): 
  import time 
  sys.stdout.write('Daemon started with pid %d\n' % os.getpid()) 
  sys.stdout.write('Daemon stdout output\n') 
  sys.stderr.write('Daemon stderr output\n') 
  c = 0 
  while True: 
    sys.stdout.write('%d: %s\n' %(c, time.ctime())) 
    sys.stdout.flush() 
    c = c+1 
    time.sleep(1) 
 
if __name__ == "__main__": 
   daemonize('/dev/null','/tmp/daemon_stdout.log','/tmp/daemon_error.log') 
   main() 
可以通过命令ps -ef | grep daemon.py查看后台运行的继承,在/tmp/daemon_error.log会记录错误运行日志,在/tmp/daemon_stdout.log会记录标准输出日志。


3.2 类实现

参考:http://pythonhosted.org/KiTT/_modules/kitt/daemon.html#Daemon

#!/usr/bin/env python

import sys, os, time, atexit
from signal import SIGTERM

class Daemon:
    """
    A generic daemon class.

    Usage: subclass the Daemon class and override the run() method
    """
    def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null', args=None):
        self.stdin = stdin
        self.stdout = stdout
        self.stderr = stderr
        self.pidfile = pidfile
        self.args = args

    def daemonize(self):
        """
        do the UNIX double-fork magic, see Stevens' "Advanced
        Programming in the UNIX Environment" for details (ISBN 0201563177)
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
        """
        try:
            pid = os.fork()
            if pid > 0:
                # exit first parent
                sys.exit(0)
        except OSError, e:
            sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
            sys.exit(1)

        # decouple from parent environment
        os.chdir("/")
        os.setsid()
        os.umask(0)

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

        # redirect standard file descriptors
        sys.stdout.flush()
        sys.stderr.flush()
        si = file(self.stdin, 'r')
        so = file(self.stdout, 'a+')
        se = file(self.stderr, 'a+', 0)
        os.dup2(si.fileno(), sys.stdin.fileno())
        os.dup2(so.fileno(), sys.stdout.fileno())
        if type(sys.stderr) is file:
            os.dup2(se.fileno(), sys.stderr.fileno())

        # write pidfile
        atexit.register(self.delpid)
        pid = str(os.getpid())
        file(self.pidfile,'w+').write("%s\n" % pid)

    def delpid(self):
        os.remove(self.pidfile)

    def start(self):
        """
        Start the daemon
        """
        # Check for a pidfile to see if the daemon already runs
        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if pid:
            message = "pidfile %s already exist. Daemon already running?\n"
            sys.stderr.write(message % self.pidfile)
            sys.exit(1)

        # Start the daemon
        self.daemonize()
        self.run()

    def stop(self):
        """
        Stop the daemon
        """
        # Get the pid from the pidfile
        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if not pid:
            message = "pidfile %s does not exist. Daemon not running?\n"
            sys.stderr.write(message % self.pidfile)
            return # not an error in a restart

        # Try killing the daemon process
        try:
            while 1:
                os.kill(pid, SIGTERM)
                time.sleep(0.1)
        except OSError, err:
            err = str(err)
            if err.find("No such process") > 0:
                if os.path.exists(self.pidfile):
                    os.remove(self.pidfile)
            else:
                print str(err)
                sys.exit(1)

    def restart(self):
        """
        Restart the daemon
        """
        self.stop()
        self.start()

    def run(self):
        """
        You should override this method when you subclass Daemon. It will be called after the process has been
        daemonized by start() or restart().
        """


4.1 执行shell

root@develop:~# cat start.sh 
#!/bin/bash

nohup python -u /opt/start.py > /var/log/start.out 2>&1 &
注意:加 -u参数,使得python不启用缓冲。python的输出有缓冲,导致ser_log.out并不能够马上看到输出。

参考:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

4.2 使用subprocess执行shell

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import string
import os
import sys
import time
from signal import SIGTERM 
import subprocess

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


	# decouple from parent environment  
	os.chdir("/")  
	os.setsid()  
	os.umask(0)  


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


	# redirect standard file descriptors  
	sys.stdout.flush()  
	sys.stderr.flush()  
	si = file(stdin, 'r')  
	so = file(stdout, 'a+')  
	se = file(stderr, 'a+', 0)  
	os.dup2(si.fileno(), sys.stdin.fileno())  
	os.dup2(so.fileno(), sys.stdout.fileno())  
	if type(sys.stderr) is file:  
		os.dup2(se.fileno(), sys.stderr.fileno())

def main():
	daemonize()
	
	cmd_list = (
                "python /opt/port",
		"python /opt/start",
        )
				
	for cmd in cmd_list:
		time.sleep(1)
		print cmd
		subprocess.Popen(cmd, stdin=None, stdout=None, stderr=None, shell=True)
		
if __name__ == "__main__":
    main()


subprocess学习: http://blog.csdn.net/imzoer/article/details/8678029

4.3 实例

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import stat
import time
import subprocess


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

    # decouple from parent environment  
    os.chdir("/")  
    os.setsid()  
    os.umask(0)  

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

    # redirect standard file descriptors  
    sys.stdout.flush()  
    sys.stderr.flush()  
    si = file(stdin, 'r')  
    so = file(stdout, 'a+')  
    se = file(stderr, 'a+', 0)  
    os.dup2(si.fileno(), sys.stdin.fileno())  
    os.dup2(so.fileno(), sys.stdout.fileno())  
    if type(sys.stderr) is file:  
        os.dup2(se.fileno(), sys.stderr.fileno())  


def start():
    # init_db()
    stderr = '/tmp/platform_daemon.log'
    daemonize(stderr=stderr)

    daemon_list = (
        "/opt/platform/auto",
        "/opt/platform/torport-start",
        "/opt/platform/tform",
        "/opt/platform/elc",
    )

    for cmd in daemon_list:
        if not os.access(cmd, os.X_OK):
            # mode:755
            os.chmod(cmd, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP |
                     stat.S_IROTH | stat.S_IXOTH)

        count = "ps -ef | grep %s | grep 'bin/' | grep -v 'grep' | wc -l" % cmd
        process = subprocess.Popen(count, stdin=None, stdout=subprocess.PIPE,
                                   stderr=None, shell=True)
        cnt = process.stdout.read()
        if not int(cnt):
            subprocess.Popen(cmd, stdin=None, stdout=None, stderr=None)
        
        time.sleep(1)


def stop():
    count = "ps -ef | grep 'platform' | grep 'bin/' | grep -v 'grep' | wc -l"
    process = subprocess.Popen(count, stdin=None, stdout=subprocess.PIPE,
                               stderr=None, shell=True)
    cnt = process.stdout.read()
    if int(cnt):
        cmd = "ps -ef | grep 'platform' | grep 'bin/' | grep -v 'grep' | " \
              "kill -9 `awk '{print $2}'`"
        subprocess.Popen(cmd, stdin=None, stdout=None, stderr=None, shell=True)
        
    # print "All the platform daemons have been stopped."


if __name__ == "__main__":
    if len(sys.argv) == 1:
        start()
    elif len(sys.argv) == 2:
        if 'start' == sys.argv[1]:
            start()
        elif 'stop' == sys.argv[1]:
            stop()
        elif 'restart' == sys.argv[1]:
            stop()
            start()
        else: 
            print 'unknown command' 
            sys.exit(1)
    else:
        print 'usage: %s [start|stop|restart]' % sys.argv[0]
        sys.exit(2)

    sys.exit(0)


参考:

1 http://www.jb51.net/article/102261.htm

2 http://www.tuicool.com/articles/2ANbym

3 http://blog.csdn.net/tao_627/article/details/49532021



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python守护进程daemon实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现Daemon(守护)进程

最近在写Daemon进程,在编写过程中遇到一些小麻烦,最终还是解决了。我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。在os.sytem()函数其
2023-01-31

python daemon守护进程实现

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。 守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实
2022-06-04

Python守护进程daemon实现

1.1 守护进程守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。在
2023-01-31

python 守护进程(daemon)

守护进程的编写步骤:1、fork子进程,然后父进程退出,此时子进程会被init进程接管。2、修改子进程的工作目录,创建新进程组合新会话,修改umask。3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。4、重定向孙子
2023-01-31

python中的daemon守护进程实现

守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。守护进程的特性1.在后台运行2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制
2023-01-31

Python 守护进程

nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下:daemonize.py#!/usr/bin/python #coding:utf-8  import sys imp
2023-01-31

python守护进程

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就
2023-01-31

[转]Python 守护进程

守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。  下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可
2023-01-31

Python setdaemon守护进程

setdaemon守护进程#_*_coding:utf-8_*___author__ = 'gaogd'import timeimport threading'''守护进程,如果主线程down了,子线程也就没有了。下面先通过主进程生成mai
2023-01-31

python守护进程监控子进程怎么实现

在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下:导入multiprocessing模块。import multiprocessing创建一个子进程的函数。def child_proces
2023-10-23

PHP怎么实现守护进程

今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。成为守护进程的步骤其实只需要创建子
2023-06-30

C#守护进程如何实现

今天小编给大家分享一下C#守护进程如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、为什么需要守护进程一般是为了保护
2023-07-02

python使用fork实现守护进程的方法

os模块中的fork方法可以创建一个子进程。相当于克隆了父进程 os.fork() 子进程运行时,os.fork方法会返回0;而父进程运行时,os.fork方法会返回子进程的PID号。 所以可以使用PID来区分两个进程:#!/usr/bin
2022-06-04

如何进行Python进程的守护进程实施

如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相
2023-06-17

linux shell实现守护进程脚本

嵌入式初学者,第一次上传代码。昨天做了一个udhcpd与udhcpc的守护,目前只会用shell模仿编写,还有什么方法可以做守护呢?#! /bin/sh #进程名字可修改 PRO_NAME=udhcpc WLAN=ra0while true
2022-06-04

Android通过JNI实现守护进程

开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了... 网上搜寻一番后,主要的方法有
2022-06-06

linux 守护进程详解及建立守护进程

linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程。守护进程的启动要启动一个守护进程,可以采取一下几种方式:在系统期间通过系统的初始化脚本启动守护进程。这些脚本通常在目录etc/rc.d下,通过它
2022-06-04

Python如何实现守护进程的方法示例

场景设置: 你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制,python服务成了终端程序的一个子进程。因此如果你关闭了终端,这个命令行程序也会随之关闭。要使你的python服务不受终端影响而常驻系统,就
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录