请参见底部的解决方案
我正在运行mysqldump
作为通过cron job调用的php脚本的一部分。
是否可以从mysqldump命令返回stderr
,也许可以将其分配给可以直接读取的变量?或者是否可以将stderr
分配给output
命令的return_var
或exec()
?
正在使用的基本命令:
$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" | gzip -c > dumpfile.sql.gz';
exec( $dump_cmd, $dump_cmd_output, $dump_cmd_return_var );
来自output
的 return_var
和exec()
无效:
$dump_cmd_output
为空,因为输出通过管道传输到gzip。
$dump_cmd_return_var
显示gzip的返回状态。
我知道其他方法可以查看mysqldump运行时是否有任何错误:
我可以在不压缩它的情况下进行转储,检查$dump_cmd_return_var
的返回状态,然后运行gzip作为附加命令。
$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" --result-file="dumpfile.sql"';
$zip_cmd = 'gzip dumpfile.sql';
exec( $dump_cmd, $dump_cmd_output, $dump_cmd_return_var );
if($dump_cmd_return_var == 0) {
exec( $zip_cmd, $zip_cmd_output, $zip_cmd_return_var );
}
我可以使用mysqldump的stderr
选项将--log-error=dump_errors.txt
从mysqldump发送到文件:
$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" --log-error=dump_errors.txt | gzip -c > dumpfile.sql.gz';
或者将stderr
发送到管道2> dump_errors.txt
之前的文件:
$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" 2> dump_errors.txt | gzip -c > dumpfile.sql.gz';
或者我可以尝试使用proc_open()
。虽然我希望我遇到与exec()
相同的问题,但执行命令(return_var
)的返回状态显示gzip返回的状态。
如果直接返回任何错误或发送到可从脚本访问的变量,它会更清晰(更简单),所以我很好奇是否可能。
解决方案:
@ user1281385有一个很好的解决方案。为了更好地理解它,我搜索了:
“bash PIPESTATUS [0]”
一个结果使用了这个确切的场景(mysqldump管道传输到gzip)。这是任何想要了解更多信息的人的链接:
Bash - How to check the exit status of pipe command
以下是我使用它的方式:
$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" | gzip -c > dumpfile.sql.gz';
system("bash -c '".$dump_cmd." ; exit \${PIPESTATUS[0]}'", $dump_cmd_return);
if($dump_cmd_return == 0) {
Do some other stuff;
}
基本上,mysqldump命令是第一个执行的命令,因此它的返回值存储为PIPESTATUS数组的第一个值(key [0])。
答案 0 :(得分:1)
proc_open
是我用过的唯一方式
类似的问题
如果它只是stderr你之后你可以将stdout重定向到无处并且stderr到stdout
或使用PIPESTAUS
系统(" bash -c' your_command;退出\ $ {PIPESTATUS [0]}'",$ return);
管道状态需要通过兼容的东西来调用。在这种情况下bash。
bash -c通过bash运行命令,PIPESTATUS将显示管道各部分的数组。