原标題:實作Linux Daemon 程序
#點選上圖,立即參與OSC源創會年終盛典#
如果我們遠端登入了遠端的 Linux 伺服器,運作了一些耗時較長的任務,如何讓指令送出後不受本地關閉終端視窗/網絡斷開連接配接的幹擾呢?
守護程序
守護程序,也即通常所說的 Daemon 程序,是 Linux 下一種特殊的背景服務程序,它獨立于控制終端并且周期性的執行某種任務或者等待處理某些發生的事件。守護程序的名稱通常以 “d” 結尾,如 “httpd”、“crond”、“mysqld”等. Redis 可以通過修改配置檔案以 Daemon方式運作.
在 Linux 中,由終端登入系統登入系統後會得到一個 shell 程序,這個終端便成為這個 shell 程序的控制終端(Controlling Terminal)。shell 程序啟動的其他程序,由于複制了父程序的資訊,是以也都同依附于這個控制終端。終端關閉,相應的程序都會自動關閉。守護程序脫離終端的目的,也即是不受終端變化的影響不被終端打斷,當然也不想在終端顯示執行過程中的資訊。
如果不想程序受到使用者、終端或其他變化的影響,就必須把它變成守護程序。
實作守護程序
通過一些特殊指令實作 Daemon 程序
nohup
如果想讓某一條長時間運作的指令不受終端退出的影響,可以使用nohup指令.
“
The nohup utility invokes utility with its arguments and at this time sets the signal SIGHUP to be ignored.If the standard output is a termi-nal, the standard output is appended to the filenohup.outin the current directory.If standard error is a terminal, it is directed to the same place as the standard output.
"
我們知道,當使用者登出(logout)或者網絡斷開時,終端會收到 HUP(hangup)信号進而關閉其所有子程序.而 nohup 的功能就是讓送出的指令忽略 hangup 信号
使用了 nohump 後,标準輸出和标準錯誤預設會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"來将指令同時放入背景運作,也可用">filename2>&1"來更改預設的重定向檔案名。
setsid()
setsid()調用成功後,程序成為新的會話組長和新的程序組長,并與原來的登入會話和程序組脫離。由于會話過程對控制終端的獨占性,程序同時與控制終端脫離。
通過程式設計,讓程序直接以 Daemon 方式運作
通常實作一個 Daemon 很簡單,幾步就可以實作,我們看一下Redis的實作.

1.第一步,先fork 一個子程序,然後退出原有程式,這樣子程序就變成一個孤兒程序.由 init做為他的父程序.進而在形式上脫離控制終端的控制。
2.調用setsid ,由新建立的子程序建立一個新的會話,并成為這個會話的 Lader.
3.将原有的stdin,stdout,stderr,都定向到 /dev/null.
以上三步是 Redis實作的 Daemon步驟.
此外,Redis 還将程序 ID 儲存到 PID 檔案裡.這裡介紹一下 PID 檔案的作用.
在linux系統的目錄/var/run下面一般我們都會看到很多的*.pid檔案。而且往往新安裝的程式在運作後也會在/var/run目錄下面産生自己的pid檔案。那麼這些pid檔案有什麼作用呢?它的内容又是什麼呢?
(1) pid檔案的内容:pid檔案為文本檔案,内容隻有一行, 記錄了該程序的ID。
用cat指令可以看到。
(2) pid檔案的作用:防止程序啟動多個副本。隻有獲得pid檔案(固定路徑固定檔案名)寫入權限(F_WRLCK)的程序才能正常啟動并把自身的PID寫入該檔案中。其它同一個程式的多餘程序則自動退出。
調用chdir 改變目前目錄為根目錄.
由于程序運作過程中,目前目錄所在的檔案系統(如:“/mnt/usb”)是不能解除安裝的,為避免對以後的使用造成麻煩,改變工作目錄為根目錄是必要的。如有特殊需要,也可以改變到特定目錄,如“/tmp”。
重設檔案權限掩碼
fork 函數建立的子程序,繼承了父程序的檔案操作權限,為防止對以後使用檔案帶來問題,需要。檔案權限掩碼,設定了檔案權限中要屏蔽掉的對應位。這個跟檔案權限的八進制數字模式表示差不多,将現有存取權限減去權限掩碼(或做異或運算),就可産生建立檔案時的預設權限。調用 umask 設定檔案權限掩碼,通常是重設為 0,清除掩碼,這樣可以大大增強守護程序的靈活性。
下面是一個用 Python 實作一個Daemon 程序
這段代碼完整的實作了 Deamon 程序,相對于 Redis,修改了檔案掩碼,目前檔案目錄,還使用了 Double Fork技術防止僵屍程序。
了解更多詳情請點選“閱讀原文”
開源中國|ID:oschina2013
每天為你送上精選資訊早點
還有每天的 OSChina 亂彈哦傳回搜狐,檢視更多
責任編輯: