如何同时运行多个ruby脚本
我试图在我的mac上同时运行多个ruby脚本,但我没有任何运气。我可以看到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
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之后
会抑制这种行为。