我必须一个接一个地在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...
我无法找到解决方案。感谢指导以解决这个问题。
由于
答案 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