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

在Ruby中使用双叉创建守护程序

阙博容
2023-03-14
问题内容

在Ruby中创建行为良好的Unix或Linux守护程序的正确方法是什么?

无论如何,行为良好的守护程序的定义是什么,如何用Ruby编写这样的程序?


问题答案:

根据 UNIX环境 第13章的Stevens 高级编程 ,这是制作行为良好的Unix守护程序的过程:

  1. 分叉并有父出口。这使Shell或引导脚本认为命令已完成。此外,保证子进程不会成为进程组负责人(下一个setsid的先决条件)
  2. 呼叫setsid以创建一个新的会话。这做三件事:
    1. 该过程成为新会话的会话负责人
    2. 该流程成为新流程组的流程组负责人
    3. 该过程没有控制终端
  3. (可选)再次分叉并具有父出口。这确保守护程序不是会话领导者,也不能获取控制终端(在SVR4下)
  4. 更改当前工作目录,/以避免干扰安装和卸载
  5. 将文件模式创建掩码设置为000,以允许以后创建具有任何必需权限的文件。
  6. 继承自父关闭不需要的文件描述符(没有控制终端反正): ,stdoutstderrstdin

如今,有一个文件可以跟踪PID,Linux发行引导脚本经常使用该文件。确保写出孙子的PID,第二个fork的返回值(步骤3)或getpid()步骤3之后的值。

这是一个Ruby实现,大部分是从书中翻译过来的,但是带有双叉并写出了守护进程PID。

# Example double-forking Unix daemon initializer.

raise 'Must run as root' if Process.euid != 0

raise 'First fork failed' if (pid = fork) == -1
exit unless pid.nil?

Process.setsid
raise 'Second fork failed' if (pid = fork) == -1
exit unless pid.nil?
puts "Daemon pid: #{Process.pid}" # Or save it somewhere, etc.

Dir.chdir '/'
File.umask 0000

STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen STDOUT


 类似资料:
  • 问题内容: 在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果检测到任何更改,则应在启动控制台的路径上加上换行符。 我已经准备好更改代码的文件系统了,但是我不知道如何创建守护程序。 我的代码来自这里:http : //www.yolinux.com/TUTORIALS/ForkExecProcesses.html 叉后该怎么办? 问题答案: 在Linux中,我想添加一个无法停止

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

  • 问题内容: 在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。 但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。 这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么? 问

  • 问题内容: 这里有人在Golang中编写了守护进程吗?你能指导我如何做吗?欢迎有用的链接。 问题答案: 是的,这已经完成。请参阅go-daemon项目。请注意,启动goroutine 后 在守护进程中发生某些问题。有关详细信息,请参见问题227。 目前,我建议您使用操作系统提供的实用程序。

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

  • 本文向大家介绍gradle 使用Gradle守护程序,包括了gradle 使用Gradle守护程序的使用技巧和注意事项,需要的朋友参考一下 示例 您可以启用Gradle守护程序来改善构建的性能。 Gradle守护程序使Gradle Framework保持初始化和运行状态,并在内存中缓存项目数据以提高性能。 对于单个版本 要为单个构建启用守护程序,您只需将--daemon参数传递给gradle命令或