2011-07-26 57 views
4

我有一個在Erlang shell中運行的Erlang程序,很明顯,我想監視它。運行erlang shell作爲守護進程/服務

這就是我想要的:

  • 當機器開始Erlang的外殼應該啓動它,並且在外殼上運行過該程序。
  • 如果Erlang shell由於某種原因崩潰,它應該重新啓動。
  • 您應該能夠手動啓動/停止/重新啓動Erlang shell。

例子:

/etc/init.d/foobar start 
/etc/init.d/foobar stop 
/etc/init.d/foobar restart 

我還沒有開始與整個「重新啓動本身,如果崩潰」的東西還在,卡住了與容易的事情,或者是容易嗎?

取自/etc/init.d/skeleton骨架代碼,並取代了PATH,DESC,名稱等等...這工作,我可以這樣做::

我做了什麼,這是

/etc/init.d/foobar start 

但是,我不能阻止它......的事情是,我開始Erlang的外殼採用「ERL」,這是一個腳本,不,我不明白了一些花哨的東西。它所做的一件事就是創建一個非常漫長而複雜的流程名稱。這不僅僅是「erl」:

/usr/lib/erlang/erts-5.7.4/bin/beam.smp - -root/usr/lib/erlang -progname erl - -home/home/xxx - ....等等。

有沒有更好的方式來做到這一點?

操作系統:Ubuntu的11.04

+0

你看到螺紋鋼? https://bitbucket.org/basho/rebar/wiki/Home – W55tKQbuRu28Q4xv

回答

2

除了創建一個目標發佈,標準的Erlang生產環境的建議@馬丁,你需要以下條件:

  • 要允許崩潰節點的自動重啓,你應該使用the heart functionality

  • 要停止正在運行的Erlang節點,你可以開始了一個臨時的Erlang節點,連接到正在運行的節點,併發出停止命令:

    erl -noshell -sname temp_control \ 
        -eval "rpc:call([email protected], init, stop, [])" \ 
        -s init stop 
    
    • noshell禁止輸入和外殼輸出
    • sname設置臨時節點的名稱
    • eval讓我們來執行任何有效的Erlang表達式
      • rpc:call(Node, M, F, A)將調用M:F(A)指定的節點上(A是參數列表將被傳遞給函數的實際參數)
    • s M F運行功能M:F()

    evals正在運行按順序)

+0

當我這樣做,我得到:從不允許節點temp_control **連接嘗試@ubuntu ** 我還沒有想出如何創建目標系統尚未雖然...我不二郎不夠好理解它:( –

+0

NVM我解決了,他們需要用相同的cookie開始:) –

+0

是的,創建目標系統是非常困難和複雜的。請查看Martin的回答(附帶我的評論),瞭解關於該主題的一些基本引文。 –

3

你想要做的是創建一個目標系統。這樣做的文檔在這裏:http://www.erlang.org/doc/system_principles/create_target.html 但是,起初有點複雜,直到你瞭解基本概念。

粗略地說,你執行以下操作:

  1. 創建一個空的節點。也就是'bin,erts和release'目錄(在bin中有更新的腳本)。
  2. 按照dox中的描述通過release_tools創建發佈。
  3. 在空節點上解壓縮發行版,將release/start_erl.data設置爲指向新版本和erts版本。

然後,這可以作爲服務與重新啓動/監視器和任何你想添加管理。

+1

更多的好資源:如何創建一個Erlang第一目標系統(http://streamhacker.com/2009/07/02/how-to-create -an-二郎先目標系統/)和[二郎/ OTP釋放:鋼筋,release_handler,.appup等](http://www.metabrew.com/article/erlangotp-releases-rebar-release_handler-appup -etc) –

+0

這些天來,我會考慮使用RELX - 它簡化成爲一個偉大的交易:https://github.com/erlware/relx –

2

最近發佈的erld項目是一個真正的d通過Erlang應用程序。它提供了所有的東西守護進程應該做的,即支持:

  • 可以開始從一個init腳本
  • 在啓動時,直到程序已成功啓動控制不會返回到控制檯/停止(或失敗這樣做)。
  • 啓動診斷信息可以被打印到控制檯,以指示進展,但輸出停止一旦守護程序正在運行。
  • 返回到控制檯時,返回碼指示成功(0)或失敗(某些其他號碼)。
  • 日誌旋轉可以通過發送SIGHUP觸發

在這裏看到自己的github頁:https://github.com/ShoreTel-Inc/erld