13

我有一堆长时间运行的 Ruby 脚本,我想确保每 30 秒左右这些脚本就会启动。

我通常通过简单地启动命令ruby script-name.rb

如何配置 monit 来管理这些脚本?

更新:我尝试按照这种方法创建一个包装脚本,然后启动 ruby​​ 进程,但它似乎没有创建 .pid 文件,并且键入 './wrapper-script stop' 什么也没做:/

我应该在 ruby​​ 中编写 pid 还是使用包装脚本来创建监视所需的 pid?

4

7 回答 7

6

Monit Wiki 有很多配置示例:

http://mmonit.com/wiki/Monit/ConfigurationExamples

只需选择一个简单的并根据您的需要进行修改。

更新:包装脚本应该在这一行中为您创建 pid:

echo $$ > /var/run/xyz.pid;

您是否根据需要调整了脚本?它是可执行的(chmod +x)吗?它是否具有目的地的写入权限?也许发布您尝试使用的包装器,以便我可以为您提供更多帮助。

于 2011-01-10T22:16:09.173 回答
4

您无需编写包装脚本或尝试任何类型的黑魔法,只需使用Daemons库即可。

想象一下,你有一个 Worker 类,它有一个方法“run”,它进入一个从套接字读取的无限循环或类似的东西,这是你编写守护程序包装器的方式:

# this is file my_worker_control.rb
require 'rubygems'
require 'daemons'
require 'worker'

Daemons.run_proc(:app_name => 'my_worker', :dir_mode => :system, :log_output => true ) do
  Worker.run
end

脚本完成后,只需从命令行或 init.d 脚本调用它:

my_worker_control.rb 运行|开始|停止|重新启动

此配置将在“/var/run”下生成一个“my_worker.pid”文件,您可以使用 monit 使用此文件监视进程。

于 2011-01-18T04:06:16.147 回答
1

修改文件:

/etc/init.d/skeleton 

您需要稍微修改它,然后:

chmod +x /etc/init.d/process_name 
sudo update-rc.d process_name defaults
sudo /etc/init.d/process_name (start| stop| reload ) 

现在只需在 /var/run/process.pid 处使用带有 pid 的 Monit

开始位置:sudo /etc/init.d/process start

停止位置: sudo /etc/init.d/process stop

干杯

于 2012-11-07T15:15:17.763 回答
0

在您的 ruby​​ 脚本中编写 pid 文件对您来说可能是最简单的(只需打开一个文件并$$在其中写入)。也就是说,包装脚本方法应该可以正常工作。您的脚本是否有权写入/var/run(或放置 pidfile 的任何位置)中的文件?

于 2011-01-16T20:22:44.030 回答
0

作为替代方案(监视),请查看bluepill

于 2011-01-18T09:07:49.890 回答
0

(当然没有主题但是)因为它是关于红宝石的,你为什么不使用: http: //god.rubyforge.org/

于 2011-01-19T14:40:16.870 回答
0

将此行添加到您的 ruby​​ 脚本 yourapp.rb 中,该脚本会创建一个pid名为yourapp.pid

File.open('/somepath/yourapp.pid', 'w') {|f| f.write Process.pid }

配置 Monit 以检查 /etc/monit/conf.d/yourapp 中的 pid

使用 pidfile /somepath/yourapp.pid 检查进程 yourapp

于 2014-09-18T18:58:07.370 回答