免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2785 | 回复: 7
打印 上一主题 下一主题

怎样执行外部程序并获得其输出, 如果出问题的话也能捕获输出及错误? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-01 17:25 |只看该作者 |倒序浏览
本帖最后由 ghostsaint 于 2010-03-01 17:33 编辑

Hi 大家好.

需哦现在使用backtick ` 来执行带参数的外部sh文件
calldb.sh
  1. #!/bin/sh

  2. sqlplus $1/$2<<END
  3. execute $3('$4');
  4. Commit;
  5. exit;
  6. END

  7. exit 0
复制代码
在shell中手动加参数运行, 一切正常;

但是通过cron, 先运行一个sh, cd到perl程序的目录, 然后执行perl程序:
  1. my $call = "./calldb.sh $dbUser $dbPwd $dbSpName ";
  2. if ($fileName =~ m/PART/i) {
  3.         $call .= "P";
  4. } elsif ($fileName =~ m/ASSET/i) {
  5.         $call .= "A";
  6. }
  7. undef $!;$result = `$call`;
  8. appLog("DB call returned: $result");
  9. if ($?) {
  10.         confess("DB Call Error Code: $?, Output: $result");
  11. }
复制代码
就会出现错误, 并且$result为空:

DB Call Error Code: -1, Output:  at app.pl line 435....


怎样才能保证出错的情况下, 能够同时获得sh的已有输出(到perl变量$result以供分析)及有价值的错误原因? 谢谢

论坛徽章:
0
2 [报告]
发表于 2010-03-01 17:38 |只看该作者
打印$call看下, 是不是有特殊字符呢

论坛徽章:
0
3 [报告]
发表于 2010-03-01 17:57 |只看该作者

$result = `$call`;
改成
@result = `$call`;
试试

论坛徽章:
0
4 [报告]
发表于 2010-03-01 18:00 |只看该作者
command  2>&1

论坛徽章:
0
5 [报告]
发表于 2010-03-01 18:19 |只看该作者
回复 1# ghostsaint


    或者用这个看看:
    `( $cmd ) 2>$log_file`

论坛徽章:
0
6 [报告]
发表于 2010-03-01 19:35 |只看该作者
Can't exec "./calldb.sh": No such file or directory at app.pl line 713.

Use of uninitialized value in concatenation (.) or string at app.pl line 714.

2010-03-01 17:31:44: DB call returned:

Use of uninitialized value in concatenation (.) or string at ipos.pl line 716.

2010-03-01 17:31:44: Call import script on /export/home/oracle/APP_INPUT/DATA_PART.TXT failed, cause: DB Call Error Code: -1, Output:  at app.pl line 435


=========
line 713: undef $!;$result = `$call`;
line 714: appLog("DB call returned: $result");
line 716: confess("DB Call Error Code: $?, Output: $result");


这些问题发生在客户环境里, 我没法重现相当郁闷.

貌似是calldb.sh的执行权限问题, 但是客户在shell下加参数运行过, 运行正常.

是否会因为通过cron调用产生的void context的问题? 但是以前类似的项目使用了相同的方法.


不解

论坛徽章:
0
7 [报告]
发表于 2010-03-02 09:03 |只看该作者
回复 6# ghostsaint


   
    应该是CALL执行不成功,所以$result 为空导致714和716报错

论坛徽章:
0
8 [报告]
发表于 2010-03-02 09:06 |只看该作者
回复 4# Perl_Er


    嘿嘿 和ER撞头啦!
   
    那我改个:open(STDERR, ">errlog.log" )
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP