2015-12-02 62 views
1

我想在我的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 
+3

如何使用'Process'類?像'fork'方法一樣? –

回答

1

就可以構建forkexec和模塊Processwait的解決方案。

# start child processes 
10.times { fork { exec(cmd) } } 
# wait for child processes 
10.times { |pid| Process.wait } 

或者稍微玩一下(在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!" 
+0

我不斷收到此錯誤:Errno :: ECHILD:沒有子進程 – botbot

+0

@botbot如果孩子已經完成,則會拋出錯誤。將'rescue'放在'waitpid'後面會抑制這種行爲。 – sschmeck

2

你是否需要從ruby開始出於任何特定原因?你爲什麼不直接從bash啓動它10次?像:

$ for i in seq 1 10 ; do nohup ruby foo.rb \&; done

讓我知道..

+1

該解決方案沒有解決問題的nohup部分。我想效果會是一樣的,但當然這是一個好主意,試試看。 – user1934428

+0

好吧,現在是尋址_nohup_不要追加輸出到tty,並逃避'&' –

+0

不,從ruby開始它不是一個要求,但我正在動態更新的變量,所以我基於計算會更麻煩它迭代一個循環與許多變量。如果沒有vars,這將更簡單,但仍然懷疑它不會殺死每個ruby進程。 – botbot

1

nohup的輸出到文件$ HOME /重定向的nohup.out,除非它被明確地重定向。您應該將每個調用的輸出重定向到不同的文件。

此外,爲了安全起見,我會將stdin重定向到/ dev/null - 以防被調用的程序從標準輸入讀取。

10.times do |i| 

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

end 

BTW(和題外話):你確定,你想傳遞ARG1 ARG2作爲單個參數來program.rb?

+0

當用ARGV [i]進行評估時,論據很好。這是危險的嗎?我應該發送一個數組對象嗎?我發送的這些參數是變數,爲了簡化問題,我簡化了它。 – botbot

+0

我發現這個答案特別有用的是,你建議如何路由輸出,這是我的另一個問題,謝謝! +1 – botbot

+0

fyi我試過這個,它沒有向nohup1.out等寫入任何文件......還檢查了ruby進程,看起來它甚至沒有啓動。不知道發生了什麼 – botbot