Python写守护进程
时间: 2024-08-02 21:00:38 浏览: 110
在Python中,创建守护进程(daemon process)通常是为了让程序在主进程退出后依然继续运行,常用于后台服务或管理系统任务。以下是一个简单的Python守护进程的例子,使用`os`和`sys`模块:
```python
import os
import sys
def daemonize():
# 将当前进程变为守护进程
try:
if os.fork() > 0:
# 父进程退出
os._exit(0)
except OSError as e:
print(f"fork #1 failed: {e.errno} ({e.strerror})")
sys.exit(1)
# 子进程,关闭标准输入、输出和错误流
os.setsid()
si = open(os.devnull, 'r')
so = open(os.devnull, 'a+')
se = open(os.devnull, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# 第二次 fork,防止僵尸进程
try:
if os.fork() > 0:
os._exit(0)
except OSError as e:
print(f"fork #2 failed: {e.errno} ({e.strerror})")
sys.exit(1)
# 重定向标准I/O到/dev/null
si.close()
so.close()
se.close()
if __name__ == "__main__":
if len(sys.argv) != 2 or sys.argv not in ["start", "stop"]:
print("Usage: python daemon.py start|stop")
sys.exit(1)
if sys.argv == "start":
daemonize()
print("Daemon started.")
elif sys.argv == "stop":
# 这里你可以添加停止服务的代码
print("Stopping the daemon...")
sys.exit(0)
```
在这个例子中,`daemonize()`函数首先执行一次fork操作,父进程退出,留下子进程成为新的进程。然后,子进程调用`setsid()`设置一个新的会话ID,并将标准输入、输出和错误重定向到/dev/null,以避免影响其他进程。接着再次执行fork操作,确保没有僵尸进程。最后根据命令行参数启动或停止守护进程。
阅读全文