簡體   English   中英

python log stderr to file

[英]python log stderr to file

我正在嘗試使用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沒有發現這個錯誤? 任何想法為什么?

不,詳細標志將文件列表打印到stderr,否則不能,因為在stdout中寫入了tar文件。 你可以做的是不要使用詳細標志。

PS。 對於這個小腳本,我認為shell腳本更有效。

嘗試在SSH命令中添加-n標志。 如果tar看到stdin輸入,它會將錯誤發送到stdout而不是stderr :“從成員名稱中刪除前導'/'

使用ssh客戶端( -n )禁用stdin將導致tar使用stderr進行報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM