subprocess 生成與動態監看

這邊在說明如何操控 subprocess ,尤其 subprocess 本身是危險的狀況

以下是一隻程式,叫做"自殺炸彈客",它自己數到 9 就會自爆,在任何程式內引入這段 code 都會很有問題,因為就算用 Thread 來開,主程式也會連同被 kill 掉,類似以下這段 code

[bomb.rb]

#下面這行還沒用到,bomb_controller.rb才必須用,不過無害就是
STDOUT.sync = true
10.times do |i|
  puts i
  if i > 8
    abort('QwQ NOO!!')
  end
  sleep(0.2)
end

然而其實有方式可以抓到他的 abort / exit 的 Exception,類似

begin
   #code here
rescue SystemExit, Interrupt
   puts "BOMB!!!"
end

但是如果不是 Ruby 的程式,類似 ping 且要及時觀察狀況呢?在舉例,類似影片轉檔, command 下下去後,如果你用的是

`command here`
system("command here")

其實都是執行完才出現結果,無法取得中間過程,類似把目前的影片轉檔進度反餽給前端,轉到多少%之類的

[bomb_controller.rb] #無限防爆與監看程式

require 'open3'
cmd = 'ruby bomb.rb' #執行另外一隻程式的 command,可以改"ping www.google.com"玩看看
counter = 0
loop do
  counter += 1
  Open3.popen2e(cmd) do |stdin , stdout|
    stdin.close
    stdout.each do |line|
      puts "I got status : #{line}"
    end
  end
  puts "NOW : #{counter}"
end

anyway 這隻可以玩看看,類似的方式就可以取得目前狀態,這比 Ruby Kernel 的 system 還好用 N 倍,而 open3 是 stdlib 所以也不用另外安裝 gem ,直接 require 就可以用就是

大概就這樣唄,這樣應該很多 Linux 指令都可以直接用 Ruby 來轉才是,且進度都會有非常方便, open3 系列都可以去看看如何操控 subprocess, 以上

1個讚