【问题标题】:Start a process and keep it running after the ruby script exits启动一个进程并在 ruby​​ 脚本退出后保持运行
【发布时间】:2014-07-26 20:49:51
【问题描述】:

我正在尝试编写一个 ruby​​ 脚本:

  1. 运行命令/脚本
  2. 将命令的进程 pid 存储在一个文件中,以便稍后检查它是否仍在运行,并且
  3. 该命令应该在 ruby​​ 代码退出后继续运行。

我在第 1 步和第 2 步中都成功了,但看起来启动的脚本(即子进程)在 ruby​​ 代码完成后终止。

这是我能想到的最后一个版本(超级简化):

pid = fork do
  exec "/my/fancy/daemon/style/script"
end
File.open('tmp/process.pid', 'w') { |file| file.write(pid.to_s) }

你能告诉我我做错了什么吗?最终目标是在 ruby​​ 代码退出后保持其他脚本(即子进程)运行。

【问题讨论】:

    标签: ruby linux process fork


    【解决方案1】:

    您可以“分离”您的子进程:

    Process.detach(pid)
    

    请参阅Process#detach 了解更多信息。

    如果您在 shell 上运行脚本,并且您的脚本是最后一个交互式进程,则您的虚拟终端可能会退出并导致您的子进程也挂起。如果您考虑不向终端发送输出,则可以在运行 exec 之前使用 Process.daemon。

    Process#daemon

    【讨论】:

    • 我并没有完全理解daemon 的情况,但detach 工作得很好。情况是另一个脚本(应该继续运行)实际上类似于守护进程,我根本不关心它的输出。此外,ruby 脚本是使用 cronjob(使用whenever)调用的,因此它不是从终端运行的。鉴于这些事实,您是否建议使用daemon 而不是detach
    • @TamerShlash 在这些条件下,我相信使用daemon 会很好,但我不确定detach 是否没有必要。它认为两者都做也不错,但只是尝试。附言我相信你在孩子的过程中调用它并且它在做exec之前。
    • 我照你说的做了。但由于某种原因,使用 daemon 将运行脚本,但进程 pid 与 fork 块返回的进程 pid 不同。因此我会坚持使用detach,因为它工作正常,非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2018-07-08
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多