【问题标题】:Ruby script as serviceRuby 脚本即服务
【发布时间】:2011-01-27 11:56:09
【问题描述】:

好吧,标题说明了一切。我有一个 ruby​​ 脚本,我想在我的 Linux 机器上作为服务(我可以启动和停止)运行。我能够在 Windows here

上找到如何做到这一点

一些读数指向创建守护进程或 cron 任务。

我只需要一些简单的东西,我可以在我的盒子重新启动时调用,并且可以随时停止/启动。我的脚本有一个内部睡眠调用,并在“永恒循环”中运行

提前致谢

【问题讨论】:

    标签: ruby linux cron


    【解决方案1】:

    我实际上找到了一种更好的方法,即使用 ruby​​ 脚本。

    我就是这样做的:

    首先,我安装了守护进程

    gem install daemons
    

    然后我做了:

    require 'rubygems'
    require 'daemons'
    
    pwd  = File.dirname(File.expand_path(__FILE__))
    file = pwd + '/runner.rb'
    
    Daemons.run_proc(
       'my_project', # name of daemon
       :log_output => true
     ) do
       exec "ruby #{file}"
    end
    

    然后我创建一个名为 runner.rb 的文件,我可以在其中调用我的脚本,例如:

    require "/var/www/rails/my_project/config/environment"
    Post.send('details....')
    

    守护进程是一个伟大的宝石!

    【讨论】:

    【解决方案2】:

    在十多年后发布我的答案原始海报提出了这个问题。

    首先,让我们创建一个简单的 ruby​​ 脚本,它将运行一个无限循环:

    # mydaemon.rb 
    $stdout.reopen('/home/rmishra/mydaemon.log', 'a')
    $stdout.sync = true
    loop.with_index do |_, i|
      puts i
      sleep(3)
    end
    

    您可以通过附加与号在后台运行脚本:

    /home/rmishra$ ruby mydaemon.rb &
    [1] *pid*
    

    要自动启动此脚本并在它停止或崩溃时重新启动它,我们将创建一个服务。

    # mydaemon.service
    [Unit]
    Description=Simple supervisor
    
    [Service]
    User=username
    Group=username
    WorkingDirectory=/home/username
    Restart=always
    ExecStart=/usr/bin/ruby mydaemon.rb
    
    [Install]
    WantedBy=multi-user.target
    

    现在,让我们将此服务文件复制到 systemd 目录:

    sudo cp mydaemon.service /lib/systemd/system -v
    

    最后,使用enable命令确保服务在系统启动时启动:

    sudo systemctl enable mydaemon.service
    

    可以使用标准systemd 命令启动、停止或重新启动服务:

    sudo systemctl status mydaemon
    sudo systemctl start mydaemon
    sudo systemctl stop mydaemon
    sudo systemctl restart mydaemon
    

    Source

    【讨论】:

    • 这是任何使用 systemd 的 Linux 发行版的正确答案。
    【解决方案3】:

    RAA - deamons 是一个非常有用的工具,用于从 ruby​​ 脚本创建 unix 守护进程。

    【讨论】:

    • 这看起来相当复杂。你能发布一个使用示例吗?还是更简单的?
    • 守护进程并不简单。关于操作系统期望从守护进程获得的功能有很多假设......创建和定义这些功能是守护进程复杂性的重要组成部分。
    【解决方案4】:

    从 1.9.x 开始,ruby 有一个内置函数:

    Process.daemon

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多