首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python守护进程daemon实现

1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。...1.2 守护进程的特性 1.在后台运行 2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。...这是为了保证守护进程的当前工作目录在一个挂载的文件系统中,该文件系统不能被卸载。 5、关闭不再需要的文件描述符。根据具体情况来定。...8、用日志系统记录出错信息    因为守护进程没有控制终端,当进程出现错误时无法写入到标准输出上,可以通过调用syslog将出错信息写入到指定的文件中。...总结守护进程编程规则 1.在后台运行,调用fork ,然后使父进程exit 2.脱离控制终端,登录会话和进程组,调用setsid()使进程成为会话组长 3.禁止进程重新打开控制终端 4.关闭打开的文件描述符

7.7K30

Nginx(4):守护进程,一份nginx实现,一份我的实现,看着拿呗

创建步骤 1、创建“孤儿进程”,形式上与终端脱离; 2、让这个“孤儿进程”成为新会话的组长,防止进程被原会话中其他进程干扰; 3、改变工作目录并重设文件创建掩码; 4、关闭文件描述符,因为没必要开着了...调用fork函数创建子进程后,使父进程立即退出。...在正在执行的进程中调用INIT_DAEMON后,进程将成为守护进程,脱离控制终端进入后台执行。...,第二子进程继续(第二子进程不再是会话组长) exit(0); } // 5)关闭打开的文件描述符 /* NOFILE 为 的宏定义 NOFILE...新产生的进程从父进程继承了某些打开的文件描述符,如果不使用这些文件描述符,则需要关闭它们。

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【计算机网络】日志与守护进程

    进程组分为 前台任务 和 后台任务 在终端2中创建后台任务和前台任务,在终端1中查询发现,后台任务的(PGID)进程组 和 (SID)会话ID相同 ,而与后台的不同 2....ID作为新的会话ID 若返回成功,则返回调用进程的PID,若返回失败,则返回-1并设置错误码 想要调用setsid,不可以是组长 如:在一家公司中你是组长,有一天你想不干了 出去创业 是不可以的,因为你手底下有一堆组员...第二个参数表示 要不要关闭 0 1 2, 默认不关 大部分情况下,都是自己实现守护进程,而不是调用该函数 自己实现守护进程化 解决组长问题 当启动时,是在bash中新起一个任务,只有一个进程自成进程组,...,则返回 -1 并将错误码返回 O_RDWR : 读写的方式 重定向函数 :输入 man dup2 可以直接将文件打开,使用dup2重定向 输出重定向对应的文件描述符是1 假设其文件描述符是fd newfd...为oldfd的一份拷贝,最后只剩下oldfd dup2(fd,1) 即 将标准输出流 重定向到 文件描述符fd中 退出守护进程 输入 kill -9 + 守护进程的PID,即可退出守护进程 完整代码

    18120

    python中的daemon守护进程实现方法

    守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。...守护进程的特性 1.在后台运行 2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。...3.启动方式特殊,它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,可以由crond启动,还可以由用户终端(通常是shell)执行。...守护进程编程规则 1.在后台运行,调用fork ,然后使父进程exit 2.脱离控制终端,登录会话和进程组,调用setsid()使进程成为会话组长 3.禁止进程重新打开控制终端 4.关闭打开的文件描述符...    verbose 表示将启动运行过程中的异常错误信息打印到终端,便于调试,建议非调试模式下关闭, 默认为1, 表示开启     save_path 表示守护进程pid文件的绝对路径

    85820

    【计算机网络】TCP协议详解

    四、返回值 成功时,listen函数返回0。 失败时,返回-1,并设置errno以指示错误原因。...四、返回值 成功时,accept函数返回一个新的套接字文件描述符,该描述符用于与连接的客户端进行通信。 失败时,返回-1,并设置errno以指示错误原因。...例如,如果尝试在一个非套接字文件描述符上调用listen,或者指定的backlog值过大导致系统资源不足,listen函数将返回错误。...这意味着守护进程不会接收任何输入,其输出和错误也不会显示在终端或任何文件中。 三、返回值 成功时,daemon函数返回0。 失败时,返回-1,并设置errno以指示错误原因。...创建新的会话:在子进程中,调用setsid()函数创建一个新的会话(session),并使该子进程成为会话的领头进程(session leader)。这会使得该进程完全与控制终端脱离。

    24610

    网络(TCP)

    **SIGCHLD**:当子进程终止时,操作系统会向父进程发送 SIGCHLD 信号。默认情况下,父进程会接收到这个信号并需要调用 wait() 或 waitpid() 来回收子进程的退出状态。...​ 把服务器进程关闭掉kill -9 PID 把打印的放进日志文件 守护进程函数daemon,上面的是模拟 ​ 在 C/C++ 中,daemon() 函数用于创建守护进程(daemon)。...如果设置为 1,守护进程将不会关闭这些文件描述符。 返回值: 成功时,返回 0。 出错时,返回 -1,并将 errno 设置为具体的错误值。...关闭文件描述符:它关闭进程的标准输入、标准输出和标准错误输出,通常会将这些文件描述符重定向到某个日志文件或 /dev/null。...使用守护进程时的注意事项 文件描述符:守护进程会关闭标准输入、标准输出和标准错误输出,因此在守护进程中通常需要将这些描述符重定向到 /dev/null 或某个日志文件。

    10510

    自带的 print 函数居然会报错?

    父进程: 子进程: 可以看到子进程的标准输出与父进程关联,也就是 popen() 所返回的那个文件描述符。...还有一点需要注意的是,当我们在父进程中打开的文件描述符,子进程也会继承过去; 比如在 task.py 中新增一段代码: x = open("1.txt", "w") 之后查看文件描述符时会发现父子进程都会有这个文件...: 但相反的,子进程中打开的文件父进程是不会有的,这个应该很容易理解。...总结 一些基础知识在排查一些诡异问题时显得尤为重要,比如本次涉及到的父子进程的管道通信,最后来总结一下: os.popen() 函数是异步执行的,如果需要拿到子进程的输出,需要自行调用 read() 函数...父子进程是通过匿名管道进行通信的,当读取端关闭时,写入端输出到达管道最大缓存时会收到 SIGPIPE 信号,从而抛出 Broken pipe 异常。 子进程会继承父进程的文件描述符。

    70310

    守护进程

    守护进程不受任何终端控制是为了避免进程在的执行的过程中在终端上输出信息,同时避免进程被终端所产生的信息打断(比如在终端输入ctrl+c或直接退出ssh连接导致的进程退出)。...--关闭不必要的文件描述符。 这一步同样可有可无,如果守护进程觉得有必要,可以这样做。如果确信没有从父进程继承什么文件描述符,或者需要这些继承的文件描述符,就不需要关闭。...--屏蔽掉标准输入,标准输出,标准错误输出。 目的很明显,我们不希望在该终端上见到守护进程的输出,用户也不期望他们在终端上的输入被守护进程所读取。 最后,举个例子来说明一下。..., "dup2(STDOUT) failed"); return NGX_ERROR; } #if 0 //这里保留了标准错误输出,使得nginx在启动过程中有致命的错误导致不能启动时...这个时候如果守护进程因为一些意外退出了,而父进程又阻塞在其它业务中无法调用wait4,就会产生僵尸进程。

    2.8K40

    网络编程『简易TCP网络程序』

    ,凑巧的是在 Linux 中网络是以挂接在文件系统的方式实现的,种种迹象表明:可以通过文件相关接口进行通信 read 从文件中读取信息(接收消息) write 向文件中写入信息(发送消息) 这两个系统调用的核心参数是...> 0 表示创建子进程成功,接下来执行父进程的代码 ret 子进程失败 子进程创建成功后,会继承父进程的文件描述符表,能轻而易举的获取客户端的 socket 套接字,从而进行网络通信...当然不止文件描述符表,得益于 写时拷贝 机制,子进程还会共享父进程的变量,当发生修改行为时,才会自己创建 注意: 当子进程取走客户端的 socket 套接字进行通信后,父进程需要将其关闭(因为它不需要了...>= 进程 无论是 后台进程 还是 前台进程,都是从同一个 bash 中启动的,所以它们处于同一个 会话 中,SID 都是 1939,并且关联的 终端文件 TTY 都是 pts/1 Linux 中一切皆文件...); 返回值:成功返回该进程的 pid,失败返回 -1 注意: 调用该函数的进程,不能是组长进程,需要创建子进程后调用 手动实现守护进程时需要注意以下几点: 忽略异常信号 0、1、2 要做特殊处理(文件描述符

    39110

    史上最全Linux服务器程序规范

    绝大多数服务器程序都有配置文件并存放在/etc下 Linux服务器程序通常在启动时生成一个PID文件并存入/var/run目录中,以记录该后台进程的PID。...用户进程时通过调用syslog函数生成系统日志的。 该函数将日志输出到一个unix本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以获取用户进程的输出。...setpid函数成功时返回0, 失败-1, 设置errno。 一个进程只能设置自己或者其子进程的PGID。并且, 当子进程调用exec系列函数后,我们也不能再在父进程中对他设置PGID。...新建一个进程组,其PGID就是调用进程的PID, 调用进程成为该组的首领。 调用进程将甩开终端(如果有) 该函数成功时返回新的进程组PGID, 失败-1, errno。...所以可以利用早先打开的文件描述符来访问调用chroot之后不能直接访问的文件(目录). 06 服务器程序后台化 最后,如何在代码中让一个进程以守护进程的防止运行,守护进程的编写遵循一定的步骤,下面一个实例

    1.9K60

    运维人必收藏的最全Linux服务器程序规范

    Linux服务器程序通常在启动时生成一个PID文件并存入/var/run目录中,以记录该后台进程的PID。...用户进程时通过调用syslog函数生成系统日志的。 该函数将日志输出到一个unix本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以获取用户进程的输出。...setpid函数成功时返回0, 失败-1, 设置errno。 一个进程只能设置自己或者其子进程的PGID。并且, 当子进程调用exec系列函数后,我们也不能再在父进程中对他设置PGID。...新建一个进程组,其PGID就是调用进程的PID, 调用进程成为该组的首领。 调用进程将甩开终端(如果有) 该函数成功时返回新的进程组PGID, 失败-1, errno。...所以可以利用早先打开的文件描述符来访问调用chroot之后不能直接访问的文件(目录). 06 服务器程序后台化 最后,如何在代码中让一个进程以守护进程的防止运行,守护进程的编写遵循一定的步骤,下面一个实例

    1.2K00

    Python 守护进程

    [这一步是可选的](译者注:这里指步骤5,因为守护程序不一定需要写文件) 6. 调用‘close()’关闭文件描述符0,1和2。...这样我们释放了从父进程继承的标     准输入,标准输出,和标准错误输出。我们没办法知道这些文描述符符可能     已经被重定向去哪里。...如果你认为有可能有打开的文件描     述符,你需要关闭它们,因为系统有一个同时打开文件数的限制。 7. 为标准输入,标准输出和标准错误输出建立新的文件描述符。...os.fork()处时,会将自己整个拷贝一份(即子进程)这时候父进程os.fork()的返回值大于零(即子进程的PID),子进程os.fork()的返回值等于零,父进程结束,子进程继续执行,这时候又遇到第二个...子进程就变成了一个无终端,无会话的完全自我掌控的后台进程了。

    93530

    python 守护进程(daemon)

    3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。 4、重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null #!...# 在/tmp/daemon_error.log会记录错误运行日志 # 在/tmp/daemon_stdout.log会记录标准输出日志。...,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。...4.修改umask 由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题 5.fork孙子进程,子进程退出 经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题

    1.1K30

    Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

    这个函数接受一个包含两个文件描述符的数组作为参数,并返回两个文件描述符:一个用于读操作,另一个用于写操作。然后,可以使用fork()创建一个子进程,并在父进程和子进程之间使用这些文件描述符进行通信。...如果创建失败,则返回-1,并将错误原因存储在全局变量errno中。可能的错误原因包括: EMFILE:进程已达到其文件描述符的最大数量。 ENFILE:系统已达到其文件描述符的最大数量。...errno: errno是一个全局变量,通常定义在头文件中,用于存储函数调用发生错误时的错误码。...例如,在阻塞模式下,如果调用read函数读取一个文件描述符,但是文件中没有数据可读,程序将会被阻塞,直到有数据到达为止。...例如,在非阻塞模式下,如果调用read函数读取一个文件描述符,但是文件中没有数据可读,read函数将立即返回一个错误码,而不会等待数据到达。

    44320

    守护进程

    kill -9 PID 把打印的放进日志文件 守护进程函数daemon,上面的是模拟 在 C/C++ 中,daemon() 函数用于创建守护进程(daemon)。...如果设置为 1,守护进程将不会关闭这些文件描述符。 返回值: 成功时,返回 0。 出错时,返回 -1,并将 errno 设置为具体的错误值。...关闭文件描述符:它关闭进程的标准输入、标准输出和标准错误输出,通常会将这些文件描述符重定向到某个日志文件或 /dev/null。...调用 daemon() 或手动设置工作目录并关闭文件描述符。...使用守护进程时的注意事项 文件描述符:守护进程会关闭标准输入、标准输出和标准错误输出,因此在守护进程中通常需要将这些描述符重定向到 /dev/null 或某个日志文件。

    7210

    supervisor添加进程_monitor进程

    nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动 minfds=1024 ;可以打开的文件描述符的最小值...; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true...= 20 ; stdout 日志文件备份数,默认是10 ; stdout 日志文件,需要注意当指定目录与文件不存在时无法正常启动,所以需要手动创建目录和文件 stdout_logfile=/opt...;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 ;包含其它配置文件...常见报错 1、日志权限错误 IOError: [Errno 13] Permission denied: ‘/var/log/supervisor/supervisord.log’ 原因,/var/log

    51710

    网络(TCP)

    如果输入流已经到达文件或流的末尾,getline 会返回 false,并且读取的字符串会为空。 总的来说,getline 在处理用户输入或文件数据时非常有用,特别是当输入中包含空格时。...**SIGCHLD**:当子进程终止时,操作系统会向父进程发送 SIGCHLD 信号。默认情况下,父进程会接收到这个信号并需要调用 wait() 或 waitpid() 来回收子进程的退出状态。...进程会话的特征包括: 每个进程在启动时都会被分配一个会话ID。 会话通常由一个进程创建,称为会话领导进程。 会话通常用于进程组管理,特别是在控制终端和后台进程之间的交互。...会话的管理由setsid()系统调用进行,当进程调用setsid()时,它会创建一个新的会话,并成为该会话的领导进程 前台任务和后台任务比较好 本质 任务里有多个进程组 每多建一个就多一个 绘画和终端都关掉了...kill -9 PID 把打印的放进日志文件 守护进程函数daemon,上面的是模拟 tcp通信时全双工的 read/write相当于拷贝到缓冲区

    11410

    Python创建daemon

    (daemon成为了init进程的子进程)       --假设daemon是从命令行启动,父进程的终止会被shell发现,之后shell会显示出另一个shell提示符并让子进程在后台运行;     -...-子进程被确保不会成为一个进程组的首进程(它从父进程继承了进程组ID,并拥有了自己唯一的进程ID,该进程ID与继承来的进程组ID是不同的,这样才能成功执行下面一个步骤)     2、子进程调用setsid...O_NOCTTY标记;       2、在setsid()调用之后执行第二个fork(),再次让父进程退出并让孙子进程继续执行,(这样确保了子进程不会成为会话组长,进程永远不会重新请求一个控制终端--根据...SystemV中获取终端规则)     4、清除进程的umask(确保daemon创建文件和目录时拥有必要的权限)     5、修改进程当前工作目录(通常改为根目录 /,保证根目录的文件系统不会被卸载即可...    --这样确保了当daemon调用在这些文件描述符上执行IO的库函数时不会出乎意料的失败; 实例: import sys,os,time def main():     """ A demo daemon

    77610

    【Linux】vscode的使用 | 进程间通信(简单概括)

    wc -l 进程 以读方式 打开文件 who进程将自己的标准输出重定向到管道中 wc -l 进程将自己的标准输入重定向到管道中 2.管道原理 每一个进程被创建时都有自己的文件描述符表 1....新创建的文件被打开时,有自己的缓冲区,它是由操作系统提供的纯纯的内存文件,不需要将自己的内容刷新到磁盘中 , 以读方式和写方式分别打开同一个文件 2....当前进程进行一次fork 操作系统会为子进程创建PCB结构,操作系统也会把文件描述符表拷贝给子进程 父进程打开的文件内容不需要再次拷贝给子进程 因为是创建子进程,是需要把进程相关的内核数据结构拷贝就可以了...为 3 与 4 ,正好对应 数组中下标 3与4的位置 系统调用为什么可以使用c语言的errno 正常来说,是调用c语言接口出错了,才调用的errno 或者 strerror的 为什么调用系统调用接口时...,也会使用 errno来说明错误的原因 系统调用接口是由系统使用c语言的一套软件 2.创建子进程以及通信 关闭不需要的fd,让父进程进行读取,让子进程进行写入 一般认为pipefd[0] 为读端 ,

    88840

    UNIX(进程间通信):05---守护进程

    守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。守护进程脱离终端的主要原因有两点:(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。...创建守护进程的过程: fork子进程, 父进程退出, 所有工作在子进程中进行形式上脱离了控制终端; 必须 子进程创建新会话, setsid函数, 使子进程完全独立出来, 脱离控制; 必须 改变当前目录为根目录...; 非必须 关闭文件描述符, 继承的打开文件不会用到, 浪费系统资源, 无法卸载, close(0), close(1), close(2); 非必须 执行核心工作 守护进程退出处理程序模型; #include...返回值: deamon()调用了fork(),如果fork成功,那么父进程就调用_exit(2)退出,所以看到的错误信息 全部是子进程产生的。如果成功函数返回0,否则返回-1并设置errno。...当然在linux环境下你也可以使用nohup ./a.out &来把a.out作为一个后台执行的服务,将后台执行的一些控制台输出重定向到nohup.out文件中。 ?

    79620
    领券