1

我有一些 Ruby 脚本a.rbb.rbc.rb. 这些脚本是从相应的包装外壳脚本调用的a.shb.shc.sh

所有这些脚本都在分布式环境中:

`a.sh` and `a.rb` are on serverA
`b.sh` and `b.rb` are on serverB
`c.sh` and `c.rb` are on serverC

我需要编写一个脚本call.rb及其包装call.sh脚本,它应该检查当前在分布式环境中运行的所有脚本。

我有逻辑可以确定我拥有的不同主机以及如何与这些不同的主机通信。

当任何 Ruby 脚本运行时,命令:

ps aux 

显示:

ruby a.rb

我不知道如何查询当前正在运行的不同脚本。需要注意的一件事是,系统中可能还会运行其他 Ruby 脚本,但我只需要检查a.rbb.rbc.rb.

4

3 回答 3

1

如果您正在进行心跳检查或设置保持活动检查,为什么不在文件启动时将其 PID 保存到文件中,然后在退出时将其删除?

构建块是:

  • $$是正在运行的脚本的当前进程 ID。
  • 在定义变量之前, Ruby 将BEGIN {}在启动时运行一个名为的块。您可以使用它来创建 PID 文件。通常我们使用类似的东西"#{ File.basename($0) }.pid"来创建文件名。
  • Ruby 将运行一个名为END {}at 关闭的块,作为最后一个任务。您可以使用它来删除 PID 文件。
  • 将 PID 文件放在众所周知的位置。这是留给你的练习,让你找出你的操作系统。

让你的看门狗扫描这些,抓取 PID,扫描进程列表以查找 PID ID,可能将它们与 pid 文件的名称相关联。

你可以想出更多的糖霜放在你的蛋糕上。

于 2013-05-15T15:06:35.997 回答
0

如果你想在 Ruby 中解决这个问题,你可以使用像God这样的进程监控工具。监控, BluepillEye

于 2013-05-15T13:01:16.807 回答
0

You can simply execute commands via SSH like this:

ssh user@host "ps -ef | grep '(ruby|[^.]+\.rb)'"

Grepping the output of ps for the script names would also work:

ps -ef | grep '(a.rb|b.rb|c.rb)'

Edit: If you don't want grep itself to show up in the process list, filter it like this:

ps -ef | grep '(a.rb|b.rb|c.rb)' | grep -v grep
于 2013-05-15T11:48:52.333 回答