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

时间:2016-02-29 17:14:33

标签: linux daemon

我正在阅读关于https://en.wikipedia.org/wiki/Daemon_%28computing%29#Creation

的守护程序
  

在严格的技术意义上,类Unix系统进程是一个守护进程   当其父进程终止并为守护进程分配init时   进程(进程号1)作为其父进程而没有   控制终端。但是,更常见的是,守护程序可以是任何守护程序   后台进程,是否是init进程的子进程。

     

在类Unix系统上,进程成为的一种常用方法   守护进程,当从命令行或从a启动进程时   启动脚本,如init脚本或SystemStarter脚本,   涉及:

     
      
  1. 与控制tty分离
  2.   
  3. 成为会议负责人
  4.   
  5. 成为流程组负责人
  6.   
  7. 通过分叉和退出(一次或两次)作为后台任务执行。有时,进程成为会话时需要这样做   领导。它还允许父进程继续其正常   执行。
  8.   
  9. 将根目录(/)设置为当前工作目录,以便进程不会保留正在使用的任何目录   已安装的文件系统(允许卸载)。
  10.   
  11. 将umask更改为0以允许open(),creat()和其他操作系统调用提供自己的权限掩码而不是   依赖于呼叫者的umask
  12.   
  13. 关闭父进程保持打开的执行时所有继承的文件,包括文件描述符0,1和2   对于标准流(stdin,stdout和stderr)。所需文件   将在稍后开放。
  14.   
  15. 使用日志文件,控制台或/ dev / null作为stdin,stdout和stderr
  16.         

    如果进程由超级服务器守护程序启动,例如inetd,   launchd或systemd,超级服务器守护进程将执行这些操作   过程的函数[5] [6] [7](旧式守护进程除外)   转换为在systemd下运行并指定为Type = forking [7]和   inetd下的“多线程”数据报服务器[5])。

  1. 是否有一个步骤可以更改进程的父进程 被守护?在我看来,没有一个步骤可以做到吗?

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

  2. 更改流程的父流程后(流程不一定 要守护进程),该过程是否可以与控制相关联 新父进程的tty? (问题的目的是为了 看看是否“保持一个过程与该过程脱离关系 控制新父进程的tty“是必要条件 “改变过程的父过程”。)

  3. 请参阅我的相关问题https://unix.stackexchange.com/questions/266565/daemonize-a-process-in-shell

    感谢。

2 个答案:

答案 0 :(得分:2)

Unix进程的父进程无法由进程本身进行更改。创建守护程序的典型方法涉及fork调用(创建将成为守护程序的进程)。然后退出初始进程,新的孤立子进程将由init进程继承,该进程将成为它的新父进程。这是在第4步中处理的。init唯一要做的就是等待所有孩子退出。 init没有控件TTY,因此一旦由init继承,守护程序就不再与控制TTY相关联。成为不相关的主要原因是防止TTY(hangups和control-C&#等)产生的信号进入守护进程。

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

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

  2. 守护程序有一个守护自身的选项。当使用该选项运行时,它会在子进程中跟fork跟随exec自身,并带有一组适当的参数。父母通常会在fork之后退出,因为他们被要求做的工作已经完成。如果它没有,则子进程需要额外的fork来为其提供可以退出的父进程。注意:这就是为什么通常作为守护进程运行的许多程序可以直接运行而不成为守护进程,"成为守护进程"选项会导致子进程关闭stdin / stdout / stderr,然后只有exec它自己的可执行文件而不会成为守护进程"选项。

答案 1 :(得分:1)

我建议使用daemon(3)。另请参阅credentials(7)

您的列表未明确提及setsid(2)

MUSL libclegacy/daemon.c分叉两次并setsid