gashero
日期:2009-09-07
目錄
經常開發伺服器程式,所以乙個強悍的daemon託管程式很重要,之前用過的最靠譜的方式就是twisted自帶的twistd了。不過想要讓它託管,需要對程式做大量的修改才行,實在是不方便。
總得來說需求是:能夠啟動進入daemon模式,能夠記錄所有螢幕列印日誌和異常日誌。
zdaemon是zope專案的子專案之一。
專案主頁:
注意:如果安裝時沒有ez_setup.py那套東西,安裝完成以後就沒有zdaemon命令。
zdaemon的主要入口是乙個zdaemon程式。
提供的子命令如下:
start :啟動程序作為daemon
stop :停止程序
restart :重啟程序
status :檢視程序執行狀態
foreground 或 fg :執行程式
kill signal :傳送signal到daemon程序
reopen_transcript :重新開啟日誌
help command :顯示命令的幫助
前台啟動,-p選項指定要執行的程式:
$ zdaemon -p "echo hello world" fg守護程序啟動:
$ zdaemon -p "sleep 100" start檢查守護程序狀態:. .daemon process started, pid=819
$ zdaemon -p "sleep 100" status停止守護程序:program running; pid=819
$ zdaemon -p "sleep 100" stop. .daemon process stopped
$ zdaemon -p "sleep 100" status
daemon manager not running
簡歷配置檔案,指定程式:
$ cat zd.conf這時會在當前目錄產生檔案 zdsockprogram sleep 100
$ zdaemon -czd.conf start
. .daemon process started, pid=1136
$ zdaemon -czd.conf stop
. .daemon process stopped
,給zdaemon進行內部管理用。
配置檔案中指定sock檔案位置:
program sleep 100可以通過zdaemon傳引數給應用程式:socket-name /tmp/demo.zdsock
$ cat zd.conf在配置檔案中傳遞環境變數:program sleep
socket-name /tmp/demo.zdsock
$ zdaemon -czd.conf start 100
. .daemon process started, pid=1149
program env在daemon執行時,程式的標準輸入會被關閉,標準輸出和錯誤輸出會收到控制,可選的重定向到標準輸出或檔案。這一切由transcript選項控制,對於長時間執行的程式很必要。socket-name /tmp/demo.zdsock
ld_library_path /home/foo/lib
home /home/foo
看例子配置:
program tail -f data執行中可以對日誌檔案重新命名,而因為zdaemon仍然開啟那個檔案,所以輸出依舊會到那個檔案中,哪怕名字改變了。這時可以告知zdaemon重新開啟日誌,這樣就又可以輸出到原來定義的日誌檔案那裡了:transcript log
zdaemon -czd.conf reopen_transcript
以下引數可以用於配置檔案的runner段或命令列選項:
program 、命令列 -p / --program :這個選項給出需要執行的程式
socket-name 、命令列 -s / --socket-name :指定unix套接字路徑
daemon 、命令列 -d / --daemon :如果為true則在後台執行,預設為開啟。子程序會做如下工作:
如果 directory 選項存在,則切換到那個目錄directory 、命令列 -z / --directory :指定守護程序執行時所在目錄重定向 stdin、stdout、stderr到/dev/null
呼叫setsid(),以便作為會話的主程序
呼叫umask()
backoff-limit 、命令列 -b / --backoff-limit :當子程序掛了,zdaemon會在1秒鐘延時以後重啟它。當子程序再次掛了,延時會再增加1秒。當延時增加到backoff-limit時,依賴於 forever 選項的值。如果 forever 為false,zdaemon會放棄並退出。乙個經常掛掉的子程序,會限制只重啟backoff-limit次。如果 forever 為true,zdaemon會繼續嘗試重啟,保持backoff-limit的時延。如果子程序保持時間超過backoff-limit秒,延時會重置為1秒。預設為10。
forever 、命令列 -f 或 --forever :如果為true,則讓掛掉的子程序一直重啟,如果為false,則在backoff-limit次後放棄而退出。預設為禁用。
exit-codes 、命令列 -x 或 --exit-codes :如果子程序的退出**在列表中,則zdaemon不會將其重啟。預設值為 0,2
,分別代表正常結束和命令語法錯誤。這些情況下重啟也沒啥用。這個行為過載了 backoff-limit 和 forever 選項。想要禁用它,可以設定值為空列表。
user 、命令列 -u 或 --user :當root使用zdaemon啟動時,這個選項指定實際執行使用者,引數可以用使用者名稱或者使用者id。user和group都是從正確的密碼入口使用 setuid() 和 setgid() 設定的。這個操作會在zdaemon的所有其他操作之前進行,除了命令列引數解析。注意當zdaemon不是以root啟動時,指定這個選項會出錯。注意事件日誌會在 setuid() 之前呼叫,這個是好還是不好呢?
umask 、命令列 -m 或 --umask :當使用守護程序時,用8進製指定umask。
default-to-interactive 、命令列 -i 或 --interactive :如果指定了該選項為true,在沒有附加命令引數時zdaemon進入互動模式。如果為false,你必須指定命令列引數才能進入互動模式。預設啟用。
logfile :指定"logtail"命令的預設日誌檔案。注意這不是zdaemon記錄日誌資訊的日誌檔案。那個日誌是由段描述的。
transcript :記錄副本日誌的檔名,命令的所有輸出副本會記錄進去。如果沒有指定命令輸出會被丟棄。僅在daemon選項有效時才有效。
prompt :控制程式使用的提示符。預設由應用提供。
(注意,一些其他選項僅對舊配置檔案有效,但是不再需要了,而且會被忽略。)
除了在runner段,還可以使用eventlog段指定日誌檔案:
path /var/log/foo/foo.log這個例子中,日誌被傳送到檔案和標準輸出。zdaemon的日誌輸出通常沒什麼意思,但是你可以用於除錯。path stdout
Daemon函式的用法
daemon 函式的用法 說明 讓乙個程式後台執行。原型 c sharp view plain copy include intdaemon intnochdir,intnoclose 引數 當 nochdir 為零時,當前目錄變為根目錄,否則不變 當 noclose 為零時,標準輸入 標準輸出和錯...
Daemon函式的用法
說明 讓乙個程式後台執行。原型 c sharp view plain copy include intdaemon intnochdir,intnoclose 引數 當 nochdir 為零時,當前目錄變為根目錄,否則不變 當 noclose 為零時,標準輸入 標準輸出和錯誤輸出重導向為 dev n...
被篡改的daemon
ecs伺服器的cpu總是被init用掉30 左右,而且可以看到整個系統的sy佔比相當之高。首先,init程序作為linux系統所有程序的父程序,負責系統的啟動過程。這個程序使用cpu資源,我們第乙個需要問自己的問題是,這個程序到底在做什麼。使用strace可以掛到正在執行的程序上,追蹤程序的系統呼叫...