【发布时间】:2011-01-27 11:56:09
【问题描述】:
好吧,标题说明了一切。我有一个 ruby 脚本,我想在我的 Linux 机器上作为服务(我可以启动和停止)运行。我能够在 Windows here
上找到如何做到这一点一些读数指向创建守护进程或 cron 任务。
我只需要一些简单的东西,我可以在我的盒子重新启动时调用,并且可以随时停止/启动。我的脚本有一个内部睡眠调用,并在“永恒循环”中运行
提前致谢
【问题讨论】:
好吧,标题说明了一切。我有一个 ruby 脚本,我想在我的 Linux 机器上作为服务(我可以启动和停止)运行。我能够在 Windows here
上找到如何做到这一点一些读数指向创建守护进程或 cron 任务。
我只需要一些简单的东西,我可以在我的盒子重新启动时调用,并且可以随时停止/启动。我的脚本有一个内部睡眠调用,并在“永恒循环”中运行
提前致谢
【问题讨论】:
我实际上找到了一种更好的方法,即使用 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....')
守护进程是一个伟大的宝石!
【讨论】:
在十多年后发布我的答案原始海报提出了这个问题。
首先,让我们创建一个简单的 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
【讨论】:
RAA - deamons 是一个非常有用的工具,用于从 ruby 脚本创建 unix 守护进程。
【讨论】:
从 1.9.x 开始,ruby 有一个内置函数:
Process.daemon
【讨论】: