当前位置: 首页 > 面试题库 >

Linux守护进程

徐新荣
2023-03-14
问题内容

我正在编写Linux守护程序。我发现了两种方法。

  1. 通过调用fork()和设置守护进程sid
  2. 使用运行程序&

哪个是正确的方法?


问题答案:

来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

以下是成为守护程序的步骤:

1.
fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不会成为流程组负责人。如果您是流程组负责人,则下一步,setsid()将失败。
2.
setsid()成为进程组和会话组组长。由于控制终端与会话相关联,并且此新会话尚未获得控制终端,因此我们的进程现在没有控制终端,这对于守护程序而言是一件好事。
3. 再次fork(),以便父级(会话组负责人)可以退出。这意味着,作为非会议小组的负责人,我们永远无法重新获得控制终端。
4. chdir(“
/”),以确保我们的进程不使用任何目录。如果不这样做,可能会导致管理员无法卸载文件系统,因为它是我们的当前目录。[等效地,我们可以切换到包含对守护程序的操作很重要的文件的任何目录。
5. umask(0),这样我们就可以完全控制所写内容的权限。我们不知道我们可能继承了什么umask。[此步骤是可选的]
6. close()fds
0、1和2。这将释放我们从父进程继承的标准输入,输出和错误。我们无法知道这些fds可能被重定向到了哪里。请注意,许多守护程序使用sysconf()确定限制_SC_OPEN_MAX。_SC_OPEN_MAX告诉您最大打开文件数/进程数。然后,在一个循环中,守护程序可以关闭所有可能的文件描述符。您必须决定是否需要执行此操作。如果您认为可能打开了文件描述符,则应该关闭它们,因为并发文件描述符的数量受到限制。
7.
为stdin,stdout和stderr建立新的打开描述符。即使您不打算使用它们,将它们打开也是一个好主意。精确地处理这些只是一个问题。例如,如果您有一个日志文件,则可能希望以stdout或stderr的形式打开它,并以stdin的形式打开“
/ dev / null”;或者,您可以以stderr和/或stdout的身份打开“ / dev /
console”,以stdin或其他对您的特定守护程序有意义的组合形式打开“ / dev / null”。



更好的是,仅调用daemon()函数(如果可用)。



 类似资料:
  • 本文向大家介绍linux下的守护进程,包括了linux下的守护进程的使用技巧和注意事项,需要的朋友参考一下 Linux下的常驻进程的作用不可忽略,但这里面的问题也不能忽略,怎么启动进程,怎么结束进程,怎么在进程挂掉之后重启进程都要设计的合理。下面看一个shell控制的php常驻进程的例子。 不废话,直接捞干货,上代码,通过代码来讲解更容易理解: 只里面有几个要强调的地方: 我用这个shell去调用

  • 在Linux中,我想添加一个无法停止的守护进程,它监视文件系统的更改。如果检测到任何更改,它应该写入启动控制台的路径以及换行符。 我已经准备好了更改文件系统的代码,但是我不知道如何创建守护进程。 我的密码是:http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html 叉子用完后怎么办?

  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow

  • 守护(Daemon)进程 我们可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。 实现守护进程 首先要保证进程在后台运行,可以在启动程序后面加&,当然更原始的方法是进程自己fork然后结束父进程。 if (pid=fork()) { exit(0); // Parent process } 然后是与终端、进程组、会话(Ses

  • Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。 Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。 Daemonset典型用法如下: 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行

  • 建议使用 systemd 管理我们的服务进程。 可以参考swoole官方文档 使用方法 请确保cabal.php配置文件中的swoole.daemonize配置为关闭状态(0或false)! 'swoole' => [ // ... 'daemonize' => 0, // ... ], 在 /etc/systemd/system/目录中,创建一个 cabal.