【问题标题】:Why is my Perl script that calls FTP all of a sudden failing?为什么我调用 FTP 的 Perl 脚本突然失败了?
【发布时间】:2010-05-24 13:35:38
【问题描述】:

我有一个脚本已经运行了一年多,现在它失败了:

它正在创建一个命令文件:

open ( FTPFILE, ">get_list");
print FTPFILE "dir *.txt"\n";
print FTPFILE "quit\n";
close FTPFILE;

然后我运行系统命令:

$command = "ftp ".$Server." < get_list | grep \"\^-\" >new_list";
$code = system($command);

检查的逻辑:

if ($code == 0) {

do stuff
} else {
log error
}

它正在记录一个错误。当我打印 $code 变量时,我得到 256。

我使用这个命令来解析 $?变量:

$exit_value  = $? >> 8;
$signal_num  = $? & 127;
$dumped_core = $? & 128;

print "Exit: $exit_value Sig: $signal_num Core: $dumped_core\n";

结果:

退出:1 Sig:0 核心:0

感谢您的帮助/见解。

【问题讨论】:

  • 如果我必须这样做,我可能会尝试使用 CPAN 中的 Net::FTP 模块。该模块看起来拥有您需要的一切,我希望调试此类问题比运行系统命令更容易。

标签: perl system


【解决方案1】:

Mel - 通过查看 ftp 命令的标准错误输出,您可能会获得更多信息。

1) FTP 命令是否在 shell 提示符下手动工作?

2) 如果命令行 ftp 工作,捕获 ftp 命令的输出(stdout stderr)并在 Perl 脚本中打印。有关这样做的几种方法,请参阅perlfaq8 - How can I capture STDERR from an external command?

两个最简单的方法是:

my $output = `$command 2>&1`; 

my $pid = open(PH, "$command 2>&1 |"); 
while (<PH>) { print "Next line from FTP output: $_"; } 

3) 正如 Snake Plissken 在评论中明智地指出的那样,另一种(并且更惯用且可能更简单)的方法是取消对“ftp”命令的系统调用,而是使用Net::FTP Perl 模块。

【讨论】:

  • +1 for Net::FTP...我继承了一堆可怕的脚本,这些脚本用 ncftp 完成了这个奇怪的命令行魔咒,由此产生的噩梦使我不再使用除 Net 之外的任何东西: :FTP。
  • @Satanicpuppy - 从 Snake Plissken 那里找到一个随机的答案并为他投票 - 他的评论是在我的答案之前发布的;)
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2020-07-05
  • 2022-06-15
  • 2019-03-02
  • 2011-09-07
  • 2021-11-21
相关资源
最近更新 更多