Ruby gem daemons 筆記

Published on:
Tags: ruby

圖片來源
フリー写真素材ぱくたそ

daemons gem 是一個能夠讓 ruby 程式以行程(process)獨立執行的 gem

當你想要有一個程式能夠在背景持續執行時,就可以可慮使用 daemons gem 來協助開發

什麼是 daemon?可以參考鳥哥的文章 17.1 什麼是 daemon 與服務 (service)

簡單來說可以當作是在背景一直執行的服務

透過 daemons gem 你可以:

  1. 將其他 script 作為 daemon 執行
  2. 將 proc 丟到 daemon 執行
  3. 將目前執行的程式變成 daemon 執行

寫個範例

範例程式(main.rb)是一個可以用在程式中建立 每 5 秒將 Process 名稱寫入 Log 的 daemon:

# main.rb

require 'daemons'
require "logger"

# 在執行的時候先取得當前目錄的絕對路徑

DIR = File.absolute_path(File.dirname(__FILE__))

class TittleDaemon
  def run(name)
    # 修改行程 (Process) 顯示的名稱

    Process.setproctitle(name)

    logger = Logger.new(log_path(name), 'daily')

    loop do
      logger.info "daemon #{name} is running"
      sleep(5)
    end
  end

  def log_path(name)
    File.join(DIR, "#{name}-running.log")
  end
end

class Main
  def start(name)
    options = {
      :ARGV                 => ['start'], # 啟動 daemon

      :backtrace            => true # 如果有發生例外會記錄到 log 中

    }
    Daemons.run_proc(name, options) { TittleDaemon.new.run(name) }
  end

  def stop(name)
    options = {
      :ARGV               => ['stop'], # 停止 daemon

      :backtrace          => true # 如果有發生例外會記錄到 log 中

    }
    Daemons.run_proc(name, options) { TittleDaemon.new.run(name) }
  end
end

操作:

首先在 Terminal 中開啟 irb,並加上 -r 參數在啟動 irb 的同時 require ./main.rb

$ irb -r ./main.rb 

在 irb 中建立 Main 的實體,並啟動一個名為 little-daemon 的 daemon

> main = Main.new
> main.start("little-daemon")

開啟另一個 Terminal 執行

$ ps aux | grep little

發現有一個名為 little-daemon 的行程正在執行

回到第一個 Terminal,這次我們請啟動另一個名為 little-daemon2 的 daemon

> main.start("little-daemon2")

在第二個 Terminal 執行以下指令可以觀察到 little-daemon2 也在執行了

$ ps aux | grep little

看看目錄底下有什麼:

$ ls -lh

可以發現除了預計會產生的 log 之外,還多了兩個結尾為 .pid 的檔案

用文字編輯器可以打開,裡面是記錄 daemon 的 PID

透過 PID 我們可以傳送訊號給 daemon ,像是立即停止,或是做其他運用

可以參考鳥哥文章 16.1 什麼是程序 (process)

最後我們回到第一個 Terminal 停止剛剛啟動的 daemon

> main = Main.new
> main.stop("little-daemon")
> main.stop("little-daemon2")

在第二個 Terminal 執行以下指令會發現 daemon 已經停止,結尾為 .pid 的檔案也已經被刪除了

$ ps aux | grep little
$ ls -lh

尾聲

想要更了解 daemons 的話,推薦玩玩 GitHub 上的 範例

還有看看程式碼裡的註解

了解一下傳入的 options 有哪些選項可以使用

要注意的是程式碼一直都有在更新,記得在閱讀的時候要將 branch 調成目前所使用的版本才不會錯亂喲

參考

Ruby daemons gem official repository

歡迎光臨鳥哥的 Linux 私房菜

Comments

comments powered by Disqus