1. 程式人生 > >python deamon example

python deamon example

繼承 ftpd dea set 子進程 問題 錯誤 都是 目錄

編寫了一個服務端程序,打開終端能直接運行程序,但是這樣終端就被限制住了。如果ctrl+c退出或者關閉終端,那麽服務端程序就會退出。於是就想著讓這個服務端程序成為守護進程,像httpd、vsftpd、mysqld一樣,一直在後端運行,不會受終端的影響。

守護進程英文為daemon,像httpd、mysqld、vsftpd最後個字母d其實就是表示daemon的意思。

守護進程的編寫步驟:

fork子進程,而後父進程退出,此時子進程會被init進程接管。修改子進程的工作目錄、創建新進程組和新會話、修改umask。
子進程再次fork一個進程,這個進程可以稱為孫子進程,而後子進程退出。重定向孫子進程的標準輸入流、標準輸出流、標準錯誤流到/dev/null。
完成上面的4個步驟,那麽最終的孫子進程就稱為守護進程。先看下代碼,後面再分析下每個步驟的原因。

技術分享圖片

上面的程序沒有任何錯誤處理,但是不影響原理分析。如果要應用到項目裏,還需完善。下面筆者談下自己對每個步驟的理解。

1、fork子進程,父進程退出

通常,我們執行服務端程序的時候都會通過終端連接到服務器,成功連接後會加載shell環境,終端和shell都是進程,shell進程是終端進程的子進程,通過ps命令可以很容易的查看到。在這個shell環境下一開始執行的程序都是shell進程的子進程,自然會受到shell進程的影響。在程序裏fork子進程後,父進程退出,對了shell進程來說,這個父進程就算執行完了,而產生的子進程會被init進程接管,從而也就脫離了終端的控制。

2、修改子進程的工作目錄

子進程在創建的時候會繼承父進程的工作目錄,如果執行的程序是在u盤裏的,就會導致u盤不能卸載。

3、創建新會話

使用setsid後,子進程就會成為新會話的首進程(session leader);子進程會成為新進程組的組長進程;子進程沒有控制終端。

4、修改umask

由於umask會屏蔽權限,所以設定為0,這樣可以避免讀寫文件時碰到權限問題。

5、fork孫子進程,子進程退出

經過上面幾個步驟後,子進程會成為新的進程組老大,可以重新申請打開終端,為了避免這個問題,fork孫子進程出來。

6、重定向孫子進程的標準輸入流、標準輸出流、標準錯誤流到/dev/null

因為是守護進程,本身已經脫離了終端,那麽標準輸入流、標準輸出流、標準錯誤流就沒有什麽意義了。所以都轉向到/dev/null,就是都丟棄的意思。

python deamon example