Linux возвращает ошибку «select: Bad file descriptor» после использования «cat» - PullRequest
1 голос
/ 13 июля 2011

Я запускаю скрипт Perl для чтения из нескольких файлов на удаленной машине.Мой код выглядит примерно так:

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

В основном я сохраняю содержимое файла в HANDLE, и все ошибки помещаются в файл errorLog.log.Но в моем файле errorLog.log я продолжаю видеть «select: Bad file descriptor».Я не уверен, что является причиной этого, и поиск Google не очень помог.Итак, мои вопросы: что означает эта ошибка и как я могу ее исправить?

РЕДАКТИРОВАТЬ: В приведенной выше команде log_2.log может не существовать на удаленном компьютере.В этом случае я хотел вывести сообщение об ошибке в errorLog.log.Поэтому, когда мой сценарий обнаруживает, что файл log_2.log не существует на компьютере, он должен записать в журнал «cat: /home/log_2.log: такого файла или каталога нет», но иногда я вижу «cat: /home/log_2.log».: Нет такого файла или каталога, выберите: «Неверный дескриптор файла» (два сообщения об ошибках без перевода строки).

1 Ответ

1 голос
/ 13 июля 2011

Я вижу три вещи не так с вашим кодом:

  1. вы не проверяете возвращаемое значение open
  2. вы используете версию с двумя аргументами open
  3. и вы используете файловый дескриптор голого слова

Первый, вероятно, скажет вам, что происходит не так, два других не являются ошибочными сами по себе, но не являются современным 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...