在Python守护进程中,我使用two-fork mode将STDOUT和STDERR重定向到某个文件:

os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

启动守护程序,STDOUT可以重定向到 /var/demo/stdout 中的指定文件 .

但是如果我通过Systemd将守护进程模块作为Linux服务,那么服务文件就像:

[Unit]
Description=demo
After=network.target

[Service]
Type=forking
WorkingDirectory=/opt/demo/
ExecStart=/bin/bash -c '/anaconda3/bin/python3 -m scheduler.run start'
PIDFile=/var/run/demo.pid
SyslogIdentifier=Demo
User=root

[Install]
WantedBy=multi-user.target

STDOUT似乎没有重定向到文件 /var/demo/stdout . 设置为 forkingExecStart 命令的服务类型已经过测试,可以按预期工作 .

所以唯一的问题是,如果Python模块作为Linux服务运行,STDOUT无法重定向到普通文件 .