在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
。
设置为分叉和 ExecStart 命令的服务类型已经过测试,可以按预期工作。
所以唯一的问题是,如果Python模块作为Linux服务运行,STDOUT无法重定向到普通文件。