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

时间:2013-02-12 12:58:56

标签: 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 完成的,输出到stdout。

我不明白为什么python脚本的输出没有转储到文件中。文件权限是正确的。日志文件已创建,但未填充。

但是,如果我删除“parameter1”,那么python脚本报告的错误消息会被正确地转储到日志文件中:

runuser -l "user" -c "/path/python-script.py > /path/file.log &"

错误消息也是通过打印完成的,所以我不明白为什么会丢弃一条消息而其他消息没有。

也许runuser将“parameter1”解释为命令或其他东西。但是,参数正确传递给脚本,正如我在ps中看到的那样:

/usr/bin/python /path/python-script.py connect

我已尝试添加2>& 1但仍然无效。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在启动脚本中遇到类似的问题,我需要记录输出。最后我想出了以下内容:

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。示例写入syslog,但如果要写入文件,请使用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并将所有输出绑定到exec内的命令。