无法在Ruby脚本中按顺序执行shell命令

时间:2015-08-17 15:34:28

标签: ruby

我必须一个接一个地在ruby脚本中执行简单的shell命令。 Mys脚本按顺序执行以下操作:检查ABC服务是否正在运行,if true then stop_services; delete directories; copy fresh directories from src to dest。以下是代码:

def stop_ABC_services
     begin
       ABC_service_cnt = "ps -fu #{user} | grep ABC  | grep -v grep | wc -l"

       while exec "#{ABC_service_cnt } >& ABC.log".to_i > 0
           exec "sh stop_ABC.sh stop >>& ABC.log"
       end

     rescue => e
          puts "Error occured in stop_siebel_services - #{e}.".red
          Kernel.exit(false)
     end
end

但是在第一种方法stop_ABC_services失败时出现以下错误:Error occured in stop_ABC_services - can't convert false into String. Cannot proceed further. Quitting...

我无法找到解决方案。感谢指导以解决这个问题。

由于

3 个答案:

答案 0 :(得分:1)

简短回答:使用括号(并且不要使用exec)。

更长的答案:通过不使用括号,您可以使ruby按照与您想要的完全不同的顺序执行代码。此

exec "#{ABC_service_cnt } >& ABC.log".to_i > 0

按此顺序执行

"#{ABC_service_cnt } >& ABC.log".to_i # => 0
0 > 0 # => false
exec false # => TypeError: no implicit conversion of false into String

应该是这个

while exec("#{ABC_service_cnt } >& ABC.log").to_i > 0

此外,您可能不想使用exec,因为它会替换当前进程。意思是,你的while(及其内部/之后的所有内容)将无法运行一次。很可能你想要system()调用,它也处理零/非零退出代码。

答案 1 :(得分:0)

你可以这样做只执行sh

system("ps aux | grep ABC | grep -v grep  && stop_ABC.sh stop >>& ABC.log")

意思是。

&安培;&安培;如果stop_ABC.sh stop >>& ABC.log

,则会ps aux | grep ABC | grep -v grep运行

您可以找到更多info here

答案 2 :(得分:0)

def stop_ABC_services
 begin
   ABC_service_cnt = "ps -fu #{user} | grep ABC  | grep -v grep | wc -l"

   while exec("#{ABC_service_cnt } >& ABC.log").to_i > 0
       exec "sh stop_ABC.sh stop >>& ABC.log"
   end

 rescue => e
      puts "Error occured in stop_ABC_services - #{e}.".red
      Kernel.exit(false)
 end
end