2011-07-13 11 views
0

リモートマシン上の複数のファイルから読み込むPerlスクリプトを実行しています。"cat:"を使用した後にLinuxが "select:Bad file descriptor"エラーを返す

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

は基本的に私は、ハンドルにファイルの内容を格納していますし、すべてのエラーがerrorLog.logファイルに移動します。私のコードは次のようになります。しかし、私のerrorLog.logファイルでは、 "select:Bad file descriptor"が表示されています。私はこれを引き起こしているのかわからないし、Googleの検索はあまり役に立たなかった。だから私の質問は:このエラーはどういう意味ですか、どうすれば解決できますか?

EDIT:上記のコマンドでは、log_2.logがリモートマシンに存在しない可能性があります。その場合、errorLog.logにエラーメッセージを出力したかったのです。だから私のスクリプトは、マシンにlog_2.logファイルが存在しないと判断した場合、 "cat:/home/log_2.log:そのようなファイルやディレクトリはありません"と記録しますが、 "cat:/home/log_2.log :そのようなファイルまたはディレクトリセレクトはありません:不正なファイル記述子 "(改行なしの2つのエラーメッセージ)。

+0

オープンハンドル、「は/ usr/binに/ sshを$ホスト猫/home/log_1.log /ホーム/ log_2 '一度試してみてくださいます。 log 2 >> errorLog.log | "' – Rahul

+0

'strace'を使ってどのファイル記述子がエラーになるのか調べることができます。おそらくfd 0,1または2を閉じましたか? – ikegami

+0

あなたが話しているこのfdはなんですか? – Dan

答えて

0

私はあなたのコードと間違って三つのことを参照してください。あなたはopen

  • の2つの引数バージョンを使用していて、裸の単語を使用しているopen
  • の戻り値をチェックしていない

    1. を最初はおそらく間違って何が起こっているかを教えてくれます

    ファイルハンドル、他の2つはそれ自体が間違っていないですが、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 
    } 
    
  • +0

    こんにちはChas、 'open'関数はPIDを返しませんか?私が正しく思い出した場合、別の方法を念頭に置いていないか、何か間違ったことがないかぎり、私はPIDによって歪めることができないと思いますか? – Dan

    +0

    openがパイプを含む場合(この場合のように)、 'open'はpidを返します。 –

    関連する問題