回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在尝试构建简单的备份/升级数据库脚本时遇到问题。</p>
<p>错误在使用子进程的mysqldump调用中:</p>
<pre><code>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)
</code></pre>
<p>在此之前,我将<code>sys.stdout</code>和<code>sys.stderr</code>重定向到文件,以便有一个日志系统。</p>
<p>在那些日志中,我发现错误:</p>
<p>[mysqldump--user=xxxxxx--password=yyyyyyyyy数据库名称| gzip>;/home/drush backup/2010-08-30.15.37/db/数据库名称.sql]
[错误]:mysqldump:找不到表:“|”</p>
<p>似乎<code>|</code>字符被视为mysqldump参数,而不是管道。</p>
<p>查看python子流程文档,这是正常的,但是如何获得所需的内容(调用命令<code>mysqldump --user=xxxxxx --password=yyyyyyyy database_name | gzip > /home/drush-backup/2010-08-30.15.37/db/database_name.sql</code>)?</p>
<p><strong>编辑</strong>我在python文档中看到了这个示例:</p>
<pre><code>output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
</code></pre>
<p>我已经编辑了我的脚本:</p>
<pre><code>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()
</code></pre>
<p>现在命令变量只是为了方便在日志中使用。</p>
<p>下一步将执行此操作,但它将在<code>></code>流中停止,并出现以下错误:</p>
<pre><code>[Error]: gzip: >: No such file or directory
gzip: /path/to/backups/dir/natabase_name.sql.gz: No such file or directory
</code></pre>
<p>显然,如果我在终端上尝试这个命令,它就会工作。</p>