如何同时运行多个ruby脚本

如何同时运行多个ruby脚本,ruby,macos,shell,command,Ruby,Macos,Shell,Command,我试图在我的mac上同时运行多个ruby脚本,但我没有任何运气。我可以看到ruby进程启动了,但随后它们立即停止了。该脚本作为单个进程运行良好,没有错误。下面是一些我尝试过的例子 10.times do system "nohup ruby program.rb \"arg1 arg2\" &" end 10.times do `nohup ruby program.rb \"arg1 arg2\" &` end 10.times do system

我试图在我的mac上同时运行多个ruby脚本,但我没有任何运气。我可以看到ruby进程启动了,但随后它们立即停止了。该脚本作为单个进程运行良好,没有错误。下面是一些我尝试过的例子

10.times do

  system "nohup ruby program.rb \"arg1 arg2\" &"

end

10.times do

  `nohup ruby program.rb \"arg1 arg2\" &`

end


10.times do

  system "ruby program.rb \"arg1 arg2\""

end

您可以使用、和模块构建解决方案

或者使用更长的时间(在Ubuntu上使用Ruby 1.8.7进行测试)。添加了
rescue nil
以在等待时抑制错误

10.times do |i|
  fork do
    ruby_cmd = "sleep(#{10-i});puts #{i}"
    exec("ruby -e \"#{ruby_cmd}\"")
  end
end

10.times { Process.wait rescue nil }
puts "Finished!"

您可以使用、和模块构建解决方案

或者使用更长的时间(在Ubuntu上使用Ruby 1.8.7进行测试)。添加了
rescue nil
以在等待时抑制错误

10.times do |i|
  fork do
    ruby_cmd = "sleep(#{10-i});puts #{i}"
    exec("ruby -e \"#{ruby_cmd}\"")
  end
end

10.times { Process.wait rescue nil }
puts "Finished!"

你需要从ruby开始吗?有什么特殊的原因吗?为什么不直接从bash启动10次呢?比如:

序列110中的i为$;do nohup ruby foo.rb\&;完成


让我知道..

出于任何特定原因,您需要从ruby启动它吗?为什么不直接从bash启动10次呢?比如:

序列110中的i为$;do nohup ruby foo.rb\&;完成


让我知道..

nohup将其输出重定向到文件$HOME/nohup.out,除非它被显式重定向。您应该将每个调用的输出重定向到不同的文件

另外,为了安全起见,我将stdin重定向到/dev/null,以防被调用的程序从stdin读取

10.times do |i|

   system "nohup ruby program.rb 'arg1 arg2' </dev/null >#{ENV['HOME']}/nohup#{i}.out &"

end
10.0倍|
系统“nohup ruby program.rb'arg1 arg2'{ENV['HOME']}/nohup{i}.out&”
结束

顺便说一句(非主题):您确定要将arg1 arg2作为单个参数传递给program.rb吗?

nohup将其输出重定向到文件$HOME/nohup.out,除非它被显式重定向。您应该将每个调用的输出重定向到不同的文件

另外,为了安全起见,我将stdin重定向到/dev/null,以防被调用的程序从stdin读取

10.times do |i|

   system "nohup ruby program.rb 'arg1 arg2' </dev/null >#{ENV['HOME']}/nohup#{i}.out &"

end
10.0倍|
系统“nohup ruby program.rb'arg1 arg2'{ENV['HOME']}/nohup{i}.out&”
结束


顺便说一句(和非主题):您确定要将arg1 arg2作为单个参数传递给program.rb吗?

使用
进程
类怎么样?像
fork
方法一样?使用
过程
类怎么样?与
fork
方法类似?此解决方案不解决问题的
nohup
部分。我想效果是一样的,但当然最好尝试一下。好的,现在解决nohup,不将输出附加到tty,并转义'&',不,从ruby开始不是一个要求,但是我使用的是动态更新的变量,所以我认为如果使用大量变量来迭代循环,那么基于变量将更麻烦。如果没有VAR,这将更简单,但仍然怀疑它是否会杀死每个ruby进程。@user1934428完全正确,此解决方案可能无法解决我的ruby进程立即被杀死的问题,但这与ruby调用的命令基本相同,这个解决方案没有解决问题的
nohup
部分。我想效果是一样的,但当然最好尝试一下。好的,现在解决nohup,不将输出附加到tty,并转义'&',不,从ruby开始不是一个要求,但是我使用的是动态更新的变量,所以我认为如果使用大量变量来迭代循环,那么基于变量将更麻烦。如果没有VAR,这将更简单,但仍然怀疑它是否会杀死每个ruby进程。@user1934428完全正确,此解决方案可能无法解决我的ruby进程立即被杀死的问题,但这基本上是相同的命令减去ruby调用的命令。使用ARGV进行计算时,参数显示良好[一]。这很危险吗?我应该改为发送数组对象吗?我发送的这些参数是VAR,我只是为了简化问题而简化了。我发现这个答案特别有用的是,您建议了如何路由输出,这是我遇到的另一个问题,谢谢!+1我尝试了这个,但它并没有写入任何文件nohup1.out等…还检查了ruby进程,它似乎还没有启动。不知道发生了什么on@botbot:您是否检查了
系统的返回代码
?另一种可能是将整个nohup行包装(仅用于测试)到一个shell脚本中,并跟踪shell脚本的执行(使用
set-x
).当使用ARGV[i]进行评估时,参数的结果很好。这很危险吗?我应该改为发送数组对象吗?我发送的这些参数是VAR,我只是为了简化问题而简化了。我发现这个答案特别有用的是,您建议了如何路由输出,这是我遇到的另一个问题,谢谢!+1我尝试了这个,但它并没有写入任何文件nohup1.out等…还检查了ruby进程,它似乎还没有启动。不知道发生了什么on@botbot:您是否检查了
系统的返回代码
?另一种可能是将整个nohup行包装(仅用于测试)到一个shell脚本中,并跟踪shell脚本的执行(使用
set-x
).我一直收到这个错误:Errno::ECHILD:没有孩子processes@botbot如果子项已完成,则会引发错误。将
rescue
放在
waitpid
后面会抑制此行为。我一直收到此错误:Errno::ECHILD:无子项processes@botbot如果子项已完成,则抛出错误。放置
rescue
waitpid之后
会抑制这种行为。