A-A+

Perl获取system返回值的问题

2014年05月05日 Programming 暂无评论

需求是这样的:

my $cmd=q{mysqldump xxxx | gzip -c >> yyy.gz};

my $ret=system($cmd);

1.  我们希望判断system是否成功;

2.  我们希望通过检查进程exit code,判断system执行$cmd命令具体的出错情况;

my $cmd = q{mysqldump xxxx | gzip -c >> yyy.gz};

my $ret = system($cmd)

if ($ret != 0) {

    # 很遗憾,事实上我们得到的返回值$ret一直是0,即正常退出!

    ...

}

原因在于shell最后拿到的是管道最后那个进程的退出码。

我们可以考虑这样,在mysqldump出错时,即退出:

my $cmd=q{mysqldump xxxx && exit 1 | gzip –c >> yyy.gz};

my $ret=system($cmd);

if ($ret == 0) {

  print qq{ok\n};

}

else {

  # 等于1

  print qq{err\n};

}

ok 需求1已经搞定,但是如果我们希望具体捕捉mysqldump的退出值,可以利用shell的PIPESTATUS数组:

my $cmd=q{mysqldump xxx | gzip –c >> yyy.gz; exit ${PIPESTATUS[0]}};

my $ret=system($cmd);

if ($ret == 0) {

print qq{ok\n};

}

elsif ($ret == 123){

  # 错误:事实上,perl的system返回值会比exit_code做的更多一些,perldoc –f system

  print qq{exit code:123\n};

}

需求2的解决方式如下:

system($cmd);

my $exit_code = $?;

if ($exit_code == -1) {

    print "failed to execute: $!\n";

}

elsif ($exit_code & 127) {

    printf "child died with signal %d, %s coredump\n",

            ($exit_code & 127),  ($exit_code & 128) ? 'with' : 'without';

}

else {

    printf "child exited with value %d\n", $exit_code >> 8;

}

不是很优雅,Perl是否有更好的解决方案呢?关注中…

原创文章,转载请注明: 转载自腾讯游戏DBA团队

本文链接地址: Perl获取system返回值的问题

文章的脚注信息由WordPress的wp-posturl插件自动生成

标签:
Copyright © 腾讯游戏DBA团队 保留所有权利.  

用户登录

分享到: