我正在尝试在python中创建一个守护进程.我发现了以下问题,其中有一些我目前正在关注的好资源,但我很好奇为什么需要双叉.我抓住谷歌,发现有足够的资源声明一个是必要的,但不是为什么.
有人提到它是为了防止守护进程获得控制终端.没有第二个叉子怎么做呢?有什么影响?
我试图理解如何使我的程序成为守护进程.所以我遇到的一些事情通常,程序执行以下步骤来成为守护进程:
fork( ).在父母中,打电话exit( ).这可以确保原始父级(守护程序的祖父级)满足其子级终止,守护程序的父级不再运行,并且守护程序不是进程组领导者.最后一点是成功完成下一步的要求.
调用setsid( ),为守护进程提供一个新的进程组和会话,两者都将其作为领导者.这也确保了进程没有关联的控制终端(因为进程刚刚创建了一个新会话,并且不会分配一个).
通过将工作目录更改为根目录chdir( ).这样做是因为继承的工作目录可以在文件系统上的任何位置.守护进程倾向于在系统正常运行时间内运行,并且您不希望保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统.
关闭所有文件描述符.
/dev/null.#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ( );
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid ( ) == -1) …Run Code Online (Sandbox Code Playgroud) 将脚本作为守护程序运行与使用nohup相比有什么影响?
我知道在分叉过程等方面有什么不同,但这对我的脚本有什么影响?
当从父进程派生的子进程死亡时,它在某种程度上仍然存在并处于僵尸状态,直到从wait()调用中获得该进程为止。
是否可以解除这种亲子关系并让孩子自动获得收成?也许让孩子成为孩子的孤儿,或者其他什么?
可能的用例:在一个长期存在的程序中创建许多“抛弃式”进程,而无需“保留”越来越多的无法由OS回收的僵尸PID。
在Linux下编写/配置应用程序的正确方法是什么,它始终运行并提供外部请求(TCP,数据库,文件系统,任何类型).
我特意不要调用这个守护进程,因为它可能意味着我不想在Linux环境中使用它.
我已经阅读了多个主题,包括:
但是没有一个能够充分比较使用哪种方法.
我看到以下选项:
但是他们中的哪一个是要走的路.或者如果它们都可以使用,那么Linux中的守护进程是什么?
我正在寻找相当于在Windows下运行应用程序作为服务(任何.exe都可以自动生成使用sc作为服务运行).
我的要求如下:
我是应用程序的作者,但不希望改变它以处理守护进程.
我的猜测是编写自定义init.d脚本,然后从/etc/init.d/functions调用daemon()函数.我对吗?
在我的程序中,在这种情况下写入 stderr 时有时会冻结:
/proc/self/exe)fprintf写入来stderr工作,在某些时候我的程序会完全锁定。调试器告诉我它的 fprintf。这里发生了什么?我已经尝试过的是,一旦没有人再监听管道,就可以防止程序崩溃SIG_IGN。但现在我陷入了困境(无论有没有SIGPIPE冻结,冻结的行为都是一样的)。SIG_IGN
任何帮助表示赞赏。