我試圖構建一個簡單的備份/升級數據庫腳本時遇到了問題。Python子流程,mysqldump和管道
的錯誤是使用子的mysqldump的呼叫:
cmdL = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb + "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(cmdL))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(cmdL)))
p = subprocess.Popen(cmdL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
是COSE之前,我重定向sys.stdout
和sys.stderr
的文件,纔能有一個日誌系統。
在這些日誌中,我發現錯誤:
[mysqldump的--user = XXXXXX --password = YYYYYYYY數據庫名稱| gzip> /home/drush-backup/2010-08-30.15.37/db/database_name.sql] [錯誤]:mysqldump:找不到表格:「|」
看起來|
字符被視爲mysqldump參數,而不是管道。
縱觀python子流程文檔,這是正常的,但我如何獲得我需要的(調用命令mysqldump --user=xxxxxx --password=yyyyyyyy database_name | gzip > /home/drush-backup/2010-08-30.15.37/db/database_name.sql
)?
編輯我剛纔看到這個例子上python文檔:
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
,我已經編輯我的腳本:
command = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb, "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
cmdL1 = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb]
cmdL2 = ["gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(command))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(command)))
p1 = subprocess.Popen(cmdL1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p2 = subprocess.Popen(cmdL2, stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
cmdError, cmdData = p2.communicate()
現在只是爲了方便使用在日誌中的命令變量。
該走了一步下一個,但它停止>
流中,與此錯誤:
[Error]: gzip: >: No such file or directory
gzip: /path/to/backups/dir/natabase_name.sql.gz: No such file or directory
顯然,如果我在它的工作原理終端嘗試命令。
的逗號添加一個空格,但加號不。 domaindb和管道連接在一起。也許這是問題?不知道你爲什麼要用逗號連接字符串,而不是僅僅使用空格並將它們保留在相同的引號內。 – xnine 2010-08-30 13:57:49
在python中可能是新手了)無論如何,我認爲我必須使用+,因爲'--user ='和db_user之間不能有空格,正確的形式應該是'--user = foo',或者我誤會了? – Strae 2010-08-30 14:12:50