python - 使用 runuser 时重定向到文件的奇怪行为

标签 python linux bash sh

我目前正在使用 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/

相关文章:

python - 大阵列的密度估计

linux - 无法 dlopen 加载模块 '/usr/lib/pa20_64/libpthread.1',因为它包含线程特定数据

linux - ^M char 在使用 echo | 时创建额外的新行邮件

bash - ftp命令删除一堆文件

python - 在第二个 SSH 终端中运行第二个 pygame 程序(用于第二个显示)会暂停,直到按下 ^C

python - subprocess.Popen 产生与 bash 不同的输出

python - 如何从另一个目录访问图像? Python

python - 是否可以在不将 Pyramid 应用程序安装为鸡蛋的情况下运行它?

python - 以编程方式检测图像是否有边框(返回 bool 值)

C 文件复制程序不适用于目录(在 Linux 上)