【问题标题】:Linux returns "select: Bad file descriptor" error after using "cat"Linux 使用“cat”后返回“select: Bad file descriptor”错误
【发布时间】:2011-07-13 17:51:46
【问题描述】:

我正在运行一个 Perl 脚本来读取远程机器上的多个文件。我的代码如下所示:

open HANDLE, "/usr/bin/ssh $host cat /home/log_1.log /home/log_2.log 2>>./errorLog.log |"

基本上我将文件内容存储到 HANDLE 中,所有错误都进入 errorLog.log 文件。但是在我的 errorLog.log 文件中,我一直看到“选择:错误的文件描述符”。我不确定是什么原因造成的,谷歌搜索并没有太大帮助。所以我的问题是:这个错误是什么意思,我该如何解决?

编辑:在上述命令中,远程机器中可能不存在 log_2.log。在这种情况下,我想将错误消息输出到 errorLog.log 中。因此,当我的脚本发现机器中不存在 log_2.log 文件时,它应该记录“cat: /home/log_2.log: No such file or directory”但有时我会看到“cat: /home/log_2.log : 没有这样的文件或目录选择:错误的文件描述符”(没有换行符的两个错误消息)。

【问题讨论】:

  • 尝试一次open HANDLE, "/usr/bin/ssh $host cat /home/log_1.log /home/log_2.log 2>>errorLog.log |"
  • 您可以尝试使用strace 来查找导致错误的文件描述符。您是否关闭了 fd 0、1 或 2?
  • 你说的这个 fd 到底是什么?

标签: linux perl ssh


【解决方案1】:

我发现您的代码存在三处错误:

  1. 你没有检查open的返回值
  2. 您正在使用open 的两个参数版本
  3. 并且您使用的是裸字文件句柄

第一个可能会告诉你出了什么问题,另外两个本身并没有错,但不是 Modern Perl。我会这样写代码

open my $fh, "-|", "/usr/bin/ssh $host cat /home/log_[12].log 2>>./errorLog.log"
    or die "could not run remote command: $!";

或者更好

use IPC::Open3;
use Symbol 'gensym';

my $err = gensym; #deal with stupidity in the IPC::Open3 interface
my $pid = open3 my $in, my $out, $err,
    "/usr/bin/ssh", $host, "cat", "/home/log_[12].log";

while (<$out>) {
    #do stuff with the stdout of ssh
}

While (<$err>) {
    #do stuff with the stderr of ssh
}

【讨论】:

  • 嗨,Chas,open 函数不是返回 PID 吗?如果我没记错的话,我不认为我可以通过 PID 进行跟踪,除非您有其他方法,或者除非我有什么问题?
  • open 确实返回一个 pid,如果打开涉及管道(如本例所示)。
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2019-09-12
  • 2016-06-05
  • 2018-04-22
相关资源
最近更新 更多