首页 文章

守护进程时是否需要更改父进程?

提问于
浏览
0

我正在阅读关于守护进程的事件https://en.wikipedia.org/wiki/Daemon_%28computing%29#Creation

在严格的技术意义上,类似Unix的系统进程是一个守护进程,当它的父进程终止并且守护进程被分配init进程(进程号1)作为其父进程并且没有控制终端时 . 但是,更常见的是,守护进程可以是任何后台进程,无论是否为init进程的子进程 . 在类Unix系统上,当进程从命令行或从启动脚本(如init脚本或SystemStarter脚本)启动时,进程成为守护进程的常用方法包括:从控制tty成为分离会话负责人成为流程组负责人通过分叉和退出(一次或两次)执行后台任务 . 有时需要将此过程成为会话负责人 . 它还允许父进程继续正常执行 . 将根目录(/)设置为当前工作目录,以便进程不会保留可能位于已装入文件系统上的任何正在使用的目录(允许将其卸载) . 将umask更改为0以允许open(),creat()和其他操作系统调用提供其自己的权限掩码,而不依赖于调用方的umask在执行时关闭所有继承的文件父进程,包括标准流(stdin,stdout和stderr)的文件描述符0,1和2 . 所需文件将在稍后打开 . 使用日志文件,控制台或/ dev / null作为stdin,stdout和stderr如果进程由超级服务器守护程序(如inetd,launchd或systemd)启动,则超级服务器守护程序将执行这些功能 . 过程[5] [6] [7](旧式守护进程除了没有转换为在systemd下运行并指定为Type = forking [7]和inetd [5]下的“多线程”数据报服务器) .

  • 那里是否有一个步骤可以更改要守护进程的父进程?在我看来,没有一个步骤吗?

守护进程时是否需要更改父进程?

  • 更改进程的父进程( a process not necessarily to be daemonized) 后,进程是否可以与新父进程的控制tty相关联?(问题的目的是查看"keeping a process disassociated from the the controlling tty of the new parent process"是否是"changing the parent process of the process"的必要条件 . )

查看我的相关问题https://unix.stackexchange.com/questions/266565/daemonize-a-process-in-shell

谢谢 .

2 回答

  • 2

    Unix进程的父进程不能被进程本身更改 . 创建守护程序的典型方法涉及 fork 调用(创建将成为守护程序的进程) . 然后退出初始进程,并且 init 进程将继承新的孤立子进程,这将成为步骤4中处理的's new parent. That' . 唯一的事情 init 将会等待所有它的子进程退出 . init 没有控制TTY,所以一旦由 init 继承,守护进程可以't become associated with a controlling TTY anymore. The main reason to become disassociated is to prevent signals generated from the TTY (hangups and control-C'等)来到守护进程 .

    通常有两种方式运行守护进程:

    • 来自shell脚本 . 该脚本在命令末尾使用 & 运算符运行守护程序的可执行文件,以将守护程序放入后台,可能使用I / O重定向来设置守护程序的stdin,stdout和/或stderr,然后退出而不使用守护程序家长 . 从shell运行可执行文件涉及shell在要运行的可执行文件的子进程中执行 fork 后跟 exec .

    • 守护程序有一个守护自身的选项 . 当使用该选项运行时,它会在子进程中跟随 exec 跟随 exec 本身并带有一组适当的参数 . 父项通常会在 fork 之后退出,因为它工作了,子进程需要一个额外的 fork 给它一个可以退出的父进程 . 注意:这就是为什么通常作为守护进程运行的许多程序可以直接运行而不成为守护进程的原因,"become a daemon"选项会导致子进程关闭stdin / stdout / stderr,然后只有 exec 它自己的可执行文件没有"become a daemon"选项 .

  • 1

    我建议使用daemon(3) . 另见credentials(7)

    你的清单没有明确提及setsid(2) .

    MUSL libc有一个legacy/daemon.c,它分叉两次并做 setsid

相关问题