日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

python网站开发linux_使用Python编写Linux系统守护进程实例

發(fā)布時間:2025/4/5 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网站开发linux_使用Python编写Linux系统守护进程实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

守護進程(daemon)是指在UNIX或其他多任務操作系統(tǒng)中在后臺執(zhí)行的電腦程序,并不會接受電腦用戶的直接操控。此類程序會被以進程的形式初始化。通常,守護進程沒有任何存在的父進程(即PPID=1),且在UNIX系統(tǒng)進程層級中直接位于init之下。守護進程程序通常通過如下方法使自己成為守護進程:對一個子進程調用fork,然后使其父進程立即終止,使得這個子進程能在init下運行。–維基百科

守護進程區(qū)別于普通用戶登陸系統(tǒng)后運行的進程,它是直接由系統(tǒng)初始化,和系統(tǒng)用戶沒有關系,而用戶開啟的進程依存與用戶連接的終端,當終端退出或斷開,進程也會隨著終止。

來看一下我Linux試驗機的進程狀態(tài):

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[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程序是已經(jīng)終止了的。也就是說,普通進程,和用戶會話相關,那么,如何去編寫一個和用戶會話無關,一直運行在后臺的進程呢?大家可能注意到了上面pid為2727的python,如果只是正常打開python,它應該是運行在bash下的,而這里卻直接運行在systemd下,實際上,它是一個守護進程,來看一下python編寫linux守護進程的簡單實現(xiàn):

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#!/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中,當一個進程的父進程終止是,系統(tǒng)會接管這個進程,讓init成為這個進程的父進程,這時候這個進程就成為了一個守護進程。需要注意的是,通過setsid,umask和chdir做工作目錄設置、關閉文件描述符、設置文件創(chuàng)建掩碼等操作。把上面的代碼保存起來,給于運行權限,并用python打開,就會看到有一個新的守護進程在運行,并且能夠處理系統(tǒng)發(fā)送的SIGHUP信號。

以上程序僅用來測試,僅能夠處理系統(tǒng)SIGHUP信號,請使用kill pid結束進程。

總結

以上是生活随笔為你收集整理的python网站开发linux_使用Python编写Linux系统守护进程实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。