Python的Daemon管理器 zdaemon

2021-08-25 13:23:20 字數 3789 閱讀 2405

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

program sleep 100

$ zdaemon -czd.conf start

. .daemon process started, pid=1136

$ zdaemon -czd.conf stop

. .daemon process stopped

這時會在當前目錄產生檔案 zdsock

,給zdaemon進行內部管理用。

配置檔案中指定sock檔案位置:

program sleep 100

socket-name /tmp/demo.zdsock

可以通過zdaemon傳引數給應用程式:

$ cat zd.conf

program sleep

socket-name /tmp/demo.zdsock

$ zdaemon -czd.conf start 100

. .daemon process started, pid=1149

在配置檔案中傳遞環境變數:

program env

socket-name /tmp/demo.zdsock

ld_library_path /home/foo/lib

home /home/foo

在daemon執行時,程式的標準輸入會被關閉,標準輸出和錯誤輸出會收到控制,可選的重定向到標準輸出或檔案。這一切由transcript選項控制,對於長時間執行的程式很必要。

看例子配置:

program tail -f data

transcript log

執行中可以對日誌檔案重新命名,而因為zdaemon仍然開啟那個檔案,所以輸出依舊會到那個檔案中,哪怕名字改變了。這時可以告知zdaemon重新開啟日誌,這樣就又可以輸出到原來定義的日誌檔案那裡了:

zdaemon -czd.conf reopen_transcript

以下引數可以用於配置檔案的runner段或命令列選項:

program 、命令列 -p / --program :這個選項給出需要執行的程式

socket-name 、命令列 -s / --socket-name :指定unix套接字路徑

daemon 、命令列 -d / --daemon :如果為true則在後台執行,預設為開啟。子程序會做如下工作:

如果 directory 選項存在,則切換到那個目錄

重定向 stdin、stdout、stderr到/dev/null

呼叫setsid(),以便作為會話的主程序

呼叫umask()

directory 、命令列 -z / --directory :指定守護程序執行時所在目錄

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

path stdout

這個例子中,日誌被傳送到檔案和標準輸出。zdaemon的日誌輸出通常沒什麼意思,但是你可以用於除錯。

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可以掛到正在執行的程序上,追蹤程序的系統呼叫...