python入門教程:使用Python編寫Linux系統守護進程實例

@本文來源於公衆號:csdn2299,喜歡可以關注公衆號 程序員學府
這篇文章主要介紹了使用Python編寫Linux系統守護進程實例,本文先是講解了什麼是守護進程,然後給出了一個Python語言的簡單實現,需要的朋友可以參考下
守護進程(daemon)是指在UNIX或其他多任務操作系統中在後臺執行的電腦程序,並不會接受電腦用戶的直接操控。此類程序會被以進程的形式初始化。通常,守護進程沒有任何存在的父進程(即PPID=1),且在UNIX系統進程層級中直接位於init之下。守護進程程序通常通過如下方法使自己成爲守護進程:對一個子進程調用fork,然後使其父進程立即終止,使得這個子進程能在init下運行。–維基百科

守護進程區別於普通用戶登陸系統後運行的進程,它是直接由系統初始化,和系統用戶沒有關係,而用戶開啓的進程依存與用戶連接的終端,當終端退出或斷開,進程也會隨着終止。
來看一下我Linux試驗機的進程狀態

[root@home tmp]# ping www.baidu.com > /dev/null &
[1] 2759
[root@home tmp]# pstree -p
systemd(1)-+-agetty(157)
      |-agetty(163)
      |-avahi-daemon(129)---avahi-daemon(134)
      |-avahi-dnsconfd(125)
      |-crond(121)
      |-dbus-daemon(130)
      |-haveged(128)
      |-ifplugd(126)
      |-nginx(226)---nginx(227)
      |-ntpd(223)
      |-python(2727)
      |-rngd(124)
      |-sshd(216)---sshd(2683)---bash(2690)-+-ping(2759)
      |                   `-pstree(2760)
      |-systemd(2687)---(sd-pam)(2688)
      |-systemd-journal(76)
      |-systemd-logind(127)
      |-systemd-udevd(89)
      `-wpa_supplicant(153)

可以看到,當前有一個ping程序在後臺運行,如果如斷開連接,再次去登陸,ping程序是已經終止了的。也就是說,普通進程,和用戶會話相關,那麼,如何去編寫一個和用戶會話無關,一直運行在後臺的進程呢?大家可能注意到了上面pid爲2727的python,如果只是正常打開python,它應該是運行在bash下的,而這裏卻直接運行在systemd下,實際上,它是一個守護進程,來看一下python編寫linux守護進程的簡單實現:

#!/usr/bin/env python
import os
import signal
import time
logfile="/tmp/daemon.log"
pid=os.fork()
#exit parent process
if pid: exit()
#get the pid of subprocess
daeid=os.getpid()
os.setsid()
os.umask(0)
os.chdir("/")
#Redirection file descriptor
fd=open("/dev/null","a+")
os.dup2(fd.fileno(),0)
os.dup2(fd.fileno(),1)
os.dup2(fd.fileno(),2)
fd.close()
log=open(logfile,'a')
log.write('Daemon start up at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
log.close()
def reload(a,b):
  log=open(logfile,'a')
  log.write('Daemon reload at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
  log.close()
while True:
  signal.signal(signal.SIGHUP,reload)
  time.sleep(2)

要點是利用linux中,當一個進程的父進程終止是,系統會接管這個進程,讓init成爲這個進程的父進程,這時候這個進程就成爲了一個守護進程。需要注意的是,通過setsid,umask和chdir做工作目錄設置、關閉文件描述符、設置文件創建掩碼等操作。把上面的代碼保存起來,給於運行權限,並用python打開,就會看到有一個新的守護進程在運行,並且能夠處理系統發送的SIGHUP信號。
以上程序僅用來測試,僅能夠處理系統SIGHUP信號,請使用kill pid結束進程。

非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深入的研習計算機基礎知識,整理好了,我放在我們的微信公衆號《程序員學府》,如果你也不甘平庸,那就與我一起在編碼之外,不斷成長吧!

其實這裏不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?[點擊加入]想做你自己想成爲高尚人,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章