在ruby中使用中断和继续信号

时间:2013-09-11 10:23:53

标签: ruby signals ruby-2.0

我有这个程序,通过api将照片上传到数据库。但是,处理和上传所有这些图像需要相当长的时间,我希望能够随机停止和恢复该过程。我认为中断和继续信号可能是好的(临时!)解决方案。

def upload
  photos.each do |photo| # photos is an array of all photos.
    api_client.upload_photos(photo.to_h)
  end
end

def to_h
 # Returns an hash of photos with an id and photo url
 # { id: 123, url: "http://www.example.com/img/1"
end

我该怎么做?

1 个答案:

答案 0 :(得分:3)

您无需在Ruby中执行任何发送SIGTSTP和SIGCONT信号的操作。

要停止正在运行的进程,只需按 Control + Z

$ ruby -e "loop { puts Time.now; sleep 1}"
2013-09-11 12:37:47 +0200
2013-09-11 12:37:48 +0200
2013-09-11 12:37:49 +0200
2013-09-11 12:37:50 +0200
2013-09-11 12:37:51 +0200
^Z
[1]  + 13764 suspended (signal)  ruby -e "loop { puts Time.now; sleep 1}"
$

继续使用fg命令:

$ fg
[1]  + 13764 continued  ruby -e "loop { puts Time.now; sleep 1}"
2013-09-11 12:38:28 +0200
2013-09-11 12:38:29 +0200
2013-09-11 12:38:30 +0200
2013-09-11 12:38:31 +0200

有关详细信息,请参阅http://en.wikipedia.org/wiki/Job_control_(Unix)

<强>更新

在Ruby中处理这个信号:

trap("TSTP") {
  # clean up
  Process.kill("STOP", Process.pid) # really stop this process
}
trap("CONT") {
  # handle restart
}