python log stderr to file

时间:2011-09-15 11:34:15

标签: python debian

我正在尝试使用ssh创建备份脚本并调用subprocess.Popen模块,然后检查是否 stderr包含任何内容并将错误写入日志文件,但它检测到第一个输出是stderr的一部分

def server():
    bpath = "/mnt/backup/server-address/usrlocalbin/"
    rpath = "/usr/local/bin"
    bpath1 = "/mnt/backup/server-address/project/"
    rpath1 = "/var/www/project"
    cmd1 = "ssh -q root@server-address tar -zcf - "+rpath+" > " +bpath+"usrlocalbin.tar.gz"
    cmd2 = "ssh -q root@server-address tar -zcf - "+rpath1+" > " +bpath1+"project.tar.gz"
    exec1 = subprocess.Popen(cmd1,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout,stderr = exec1.communicate()
    if stderr:
        log.write(t+ " "+ stderr + " \n")
    else:
        log.write(t+ " "+ "Backup of /usr/local/bin/ for server-address complete..\n")
    exec2 = subprocess.Popen(cmd2, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    stdout,stderr = exec2.communicate()
    if stderr:
        log.write(t+ " "+ stderr + " \n")
    else:
        log.write(t+ " "+ "Backup of /var/www/project for server-address complete..\n")

在日志文件

15-September-2011_12.14PM tar: Removing leading `/' from member names

我认为它拾起了第一行,并认为它是stderr的一部分...任何想法如何解决这个问题?

经过更多研究后

这是因为焦油......

使用

修复

“ssh -q root @ cce-linsvcs-001 tar zcfP - ”+ rpath +“>”+ bpath +“usrlocalbin.tar.gz”

新错误

再次测试stderr,我将ssh禁用到远程主机

ssh root@server-address
ssh: connect to host server-address port 22: No route to host

并且stderr没有发现这个错误?知道为什么吗?

2 个答案:

答案 0 :(得分:2)

不,详细标志将文件列表打印到stderr,否则不能,因为在stdout中写入了tar文件。你可以做的是不要使用详细标志。

PS。对于这个小脚本,我认为shell脚本更有效。

答案 1 :(得分:0)

尝试在SSH命令中添加-n标志。 如果tar看到stdin输入,则会将错误发送到stdout而不是stderr: “从成员名称中删除前导'/'

使用ssh客户端stdin停用-n会导致tar使用stderr进行举报。