在Linux系统中,守护进程(Daemon)是一种在后台运行的特殊进程,通常用于执行系统级的任务,如服务器监听、日志记录、定时任务等。守护进程不与终端交互,即使终端关闭,守护进程也会继续运行。
fork()
创建子进程,然后父进程退出,子进程继续运行。setsid()
创建新的会话,使子进程成为会话领导者。umask(0)
设置文件权限掩码。/dev/null
。import os
import sys
import time
def daemonize():
try:
pid = os.fork()
if pid > 0:
# Exit first parent
sys.exit(0)
except OSError as e:
sys.stderr.write(f"Fork #1 failed: {e.errno} ({e.strerror})\n")
sys.exit(1)
# Decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)
# Do second fork
try:
pid = os.fork()
if pid > 0:
# Exit from second parent
sys.exit(0)
except OSError as e:
sys.stderr.write(f"Fork #2 failed: {e.errno} ({e.strerror})\n")
sys.exit(1)
# Redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
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())
def main():
while True:
# Your daemon code here
time.sleep(1)
if __name__ == "__main__":
daemonize()
main()
systemd
或supervisord
等工具进行管理。systemd
管理守护进程systemd
是现代Linux系统中常用的初始化系统和系统管理器,可以方便地管理守护进程。
/etc/systemd/system/
目录下创建服务文件,如mydaemon.service
。[Unit]
Description=My Daemon
After=network.target
[Service]
ExecStart=/path/to/mydaemon
Restart=always
User=myuser
Group=mygroup
[Install]
WantedBy=multi-user.target
systemd
配置:sudo systemctl daemon-reload
sudo systemctl start mydaemon
sudo systemctl enable mydaemon
通过以上步骤,可以方便地配置和管理Linux系统中的守护进程。
领取专属 10元无门槛券
手把手带您无忧上云