我目前正在使用 runuser 执行一个 python 文件并将输出重定向到一个文件。这是命令:
runuser -l "user" -c "/path/python-script.py parameter1 > /path/file.log &"
这会正确运行 python 脚本,但会创建一个空日志文件。如果我在没有重定向的情况下运行:
runuser -l "user" -c "/path/python-script.py parameter1 &"
正确运行 python 脚本并使 python 脚本的所有输出在屏幕上流动。 python 脚本的输出是通过 print 输出到标准输出的。
我不明白为什么 python 脚本的输出没有转储到文件中。文件权限正确。日志文件已创建,但未填充。
但是,如果我删除“parameter1”,则 python 脚本报告的错误消息会正确转储到日志文件中:
runuser -l "user" -c "/path/python-script.py > /path/file.log &"
错误信息也是用print完成的,所以我不明白为什么一条信息被转储而其他信息没有。
也许 runuser 将“parameter1”解释为命令或其他东西。但是,参数已正确传递给脚本,正如我在 ps 中看到的那样:
/usr/bin/python /path/python-script.py connect
我试过添加 2>&1 但还是不行。
有什么想法吗?
最佳答案
在启动脚本中遇到了类似的问题,我需要在其中记录输出。最后我想出了以下内容:
USR=myuser
PRG=myprogrog
WKD="/path/to/workdir"
BIN="/path/to/binary"
ARG="--my arguments"
PID="/var/run/myapp/myprog.pid"
su -l $USR -s /bin/bash -c "exec > >( logger -t $PRG ) 2>&1 ; cd $WKD; { $BIN $ARG & }; echo \$! > $PID "
很方便,因为您还可以获得可用的进程 PID。示例写入系统日志,但如果要写入文件,请使用 cat:
LOG="/path/to/file.log"
su -l $USR -s /bin/bash -c "exec > >( cat > $LOG ) 2>&1 ; cd $WKD; { $BIN $ARG & }; echo \$! > $PID "
它启动一个新的 shell 并将所有输出绑定(bind)到 exec 中的命令。
关于python - 使用 runuser 时重定向到文件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833153/