如何捕获MySQL Client中发出的系统命令的返回值

时间:2013-09-01 22:11:05

标签: mysql bash lvm

我正在使用MySQL客户端连接来发出FLUSH TABLES WITH READ LOCK,然后创建LVM快照。我希望更高级别的脚本(Ruby)捕获快照创建的返回代码,但无法确定如何在MySQL客户端中捕获它。简化:

mysql> system pwd
/root

我希望system返回0.

mysql> system foo
sh: 1: foo: not found

我希望system以bash等方式返回127

是否有某种方法可以在MySQL客户端中检索该错误代码并在MySQL客户端退出时将其返回,将其写入文件以供控制脚本读取等。

2 个答案:

答案 0 :(得分:2)

要在同时运行系统命令的上下文中运行FTWRL 并且它们彼此依赖,表示您要刷新,然后快照,然后决定要做什么基于释放表锁之前的那个。

您需要在同一个脚本中执行此操作以确保它们一起工作,并且您正尝试在SQL脚本中执行此操作。通过从内部系统脚本运行SQL脚本,反之亦然,因为您根据shell条件而不是SQL条件做出决策。

这是我如何做到的(在Perl中):

#!/usr/bin/perl -w
use DBI;
my $d = DBI->connect('dbi:mysql:mysql','root','***');
$d->do('FLUSH TABLES WITH READ LOCK') or die ("Can't flush tables in MySQL");
# Here's the important bit: Capture the status in $s and branch on the result
my $s = system('lvm lvcreate -s -n lv_datadirbackup -L 4G /dev/VG_MYSQL/lv_datadir');
if($s == 0) {
   print ("Snapshot created.\n");
   $d->do('UNLOCK TABLES') or die("Can't unlock tables");
   ... # etc

这样您就可以创建表锁获取快照,并使用您的脚本根据快照状态控制接下来发生的事情。

答案 1 :(得分:0)

你可以这样做:


root@localhost> mysql
mysql> system bash
root@localhost> foo
foo: not found
root@localhost> echo $? > logfile
root@localhost> exit
mysql>

logfile现在包含您的返回值。 如果你想自动化它,你可以例如。创建这些脚本:

script_bash.sh:

#!/bin/bash
foo
echo $? > logfile

script_mysql.sql:

system script_bash.sh

然后:

root@localhost> chmod +x script_bash.sh
root@localhost> mysql < script_mysql.sql #or mysql -e"script_bash.sh"
root@localhost> cat logfile
127

能否这样做并不意味着你应该这样做:)我肯定会建议从“控制脚本”中解雇系统命令。