相关疑难解决方法(0)

在创建守护进程时执行双叉的原因是什么?

我正在尝试在python中创建一个守护进程.我发现了以下问题,其中有一些我目前正在关注的好资源,但我很好奇为什么需要双叉.我抓住谷歌,发现有足够的资源声明一个是必要的,但不是为什么.

有人提到它是为了防止守护进程获得控制终端.没有第二个叉子怎么做呢?有什么影响?

python unix daemon

156
推荐指数
5
解决办法
5万
查看次数

如何制作进程守护进程

我试图理解如何使我的程序成为守护进程.所以我遇到的一些事情通常,程序执行以下步骤来成为守护进程:

  1. 打电话fork( ).
  2. 在父母中,打电话exit( ).这可以确保原始父级(守护程序的祖父级)满足其子级终止,守护程序的父级不再运行,并且守护程序不是进程组领导者.最后一点是成功完成下一步的要求.

  3. 调用setsid( ),为守护进程提供一个新的进程组和会话,两者都将其作为领导者.这也确保了进程没有关联的控制终端(因为进程刚刚创建了一个新会话,并且不会分配一个).

  4. 通过将工作目录更改为根目录chdir( ).这样做是因为继承的工作目录可以在文件系统上的任何位置.守护进程倾向于在系统正常运行时间内运行,并且您不希望保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统.

  5. 关闭所有文件描述符.

  6. 打开文件描述符0,1和2(标准输入,标准输出和标准错误)并将其重定向到/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)

c linux daemon systems-programming

67
推荐指数
1
解决办法
5万
查看次数

nohup和守护进程有什么区别?

将脚本作为守护程序运行与使用nohup相比有什么影响?

我知道在分叉过程等方面有什么不同,但这对我的脚本有什么影响?

unix daemon

57
推荐指数
3
解决办法
4万
查看次数

与父进程分离子进程

当从父进程派生的子进程死亡时,它在某种程度上仍然存在并处于僵尸状态,直到从wait()调用中获得该进程为止。

是否可以解除这种亲子关系并让孩子自动获得收成?也许让孩子成为孩子的孤儿,或者其他什么?

可能的用例:在一个长期存在的程序中创建许多“抛弃式”进程,而无需“保留”越来越多的无法由OS回收的僵尸PID。

unix posix child-process

5
推荐指数
1
解决办法
3551
查看次数

编写一个linux守护进程

在Linux下编写/配置应用程序正确方法是什么,它始终运行并提供外部请求(TCP,数据库,文件系统,任何类型).

我特意不要调用这个守护进程,因为它可能意味着我不想在Linux环境中使用它.

我已经阅读了多个主题,包括:

Linux守护进程

编写linux守护进程的最佳方法

以不同用户身份运行Linux服务的最佳实践

但是没有一个能够充分比较使用哪种方法.

我看到以下选项:

  • 编写应用程序,分叉,调用setpid,umask等,但这需要应用程序自己执行许多步骤; (使用init.d自动启动?)
  • 使用daemon()init.d函数执行大部分这些步骤(但它可以移植到所有/许多Linux发行版)
  • 用&运行应用程序并相信它在后台运行

但是他们中哪一个是要走路.或者如果它们都可以使用,那么Linux中的守护进程是什么?

我正在寻找相当于在Windows下运行应用程序作为服务(任何.exe都可以自动生成使用sc作为服务运行).


我的要求如下:

  • 启动后启动(自动)
  • 作为特定用户(不是root)运行
  • 可以访问整个文件系统(/),但创建/修改文件作为运行应用程序的用户
  • 可以通过服务启动,服务停止来控制
  • 崩溃或杀死后可能会自动重启
  • 可以写入syslog
  • 在RHEL7下运行

我是应用程序的作者,但不希望改变它以处理守护进程.

我的猜测是编写自定义init.d脚本,然后从/etc/init.d/functions调用daemon()函数.我对吗?

c linux daemon rhel

3
推荐指数
1
解决办法
1289
查看次数

写入“stderr”时冻结

在我的程序中,在这种情况下写入 stderr 时有时会冻结:

  1. 程序启动(例如从终端)
  2. 程序分叉两次并使用 execvp 以不同的参数启动每个进程(原始文件是从 读取的/proc/self/exe
  3. 第一个启动的程序退出。
  4. 现在两个fork进程仍在运行
  5. 关闭终端第一个程序已启动
  6. 尝试使用fprintf写入来stderr工作,在某些时候我的程序会完全锁定。调试器告诉我它的 fprintf。

这里发生了什么?我已经尝试过的是,一旦没有人再监听管道,就可以防止程序崩溃SIG_IGN。但现在我陷入了困境(无论有没有SIGPIPE冻结,冻结的行为都是一样的)。SIG_IGN

任何帮助表示赞赏。

c linux freeze stderr

2
推荐指数
1
解决办法
1192
查看次数

标签 统计

daemon ×4

c ×3

linux ×3

unix ×3

child-process ×1

freeze ×1

posix ×1

python ×1

rhel ×1

stderr ×1

systems-programming ×1