2013-05-15 38 views
0

我有几个Ruby脚本:a.rb,b.rbc.rb。这些脚本从相应的包装器外壳脚本中调用:a.sh,b.shc.sh如何查询当前在Unix上运行的Ruby脚本?

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

`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.rb,b.rbc.rb

+1

除了调用相应的Ruby脚本,还是只调用脚本之外,您的shell脚本还能做些什么吗?如果他们所做的只是调用脚本,那么可以降低复杂性并直接调用Ruby脚本或“ruby a.rb”。 –

回答

0

您可以通过SSH这样简单地执行命令:

ssh [email protected] "ps -ef | grep '(ruby|[^.]+\.rb)'" 

Grepps为脚本命名输出也将工作:

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

编辑:如果你不” t要grep自己显示在进程列表中,像这样过滤它:

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

'grep'(a.rb | b.rb | c.rb)''会工作,假设没有其他文件,如'foo_a.rb'或'foo_b.rb'。另外,为什么不''(a | b | c).rb''或''[abc] .rb''? –

+0

你绝对正确,正则表达式可以简化。说实话,我只是把它写下来而没有多想太多:)。 –

0

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

0

如果你正在做一个心跳检查,或设立一个保活检查,为什么不将文件保存他们的PID到文件在它们的启动,然后删除,当他们退出?

构件是:

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

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

你可以找出更多的结冰放在你的蛋糕。