end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

mod_perl + Net::OpenSSH で child process STDIN is not a real system file handle

mod_perl環境下で ssh, scpする為に Net::OpenSSH をnew()すると、見慣れないerrorが発生。

my $ssh = Net::OpenSSH->new('localhost',
			    user  =>'endo',
			    passwd=>'ないしょ');

↑こう書くと、apacheerror_logに次のようなエラー。

An error occurred at preview.pl.  child process STDIN is not a real system file handle at 〜

http://www.perlmonks.org/?node_id=830581
↑このurlによれば、mod_perlが標準入力を握っていることが原因みたい。なので、つぎのように修正することで解決。

my $DUMMY_STDIN_OUT = '/dev/null';
open(my $stdin_fh,$DUMMY_STDIN_OUT)  or die "can't open $DUMMY_STDIN_OUT $!";
open(my $stdout_fh,$DUMMY_STDIN_OUT) or die "can't open $DUMMY_STDIN_OUT $!";
my $ssh = Net::OpenSSH->new('localhost',
		            user   =>'endo',
			    passwd =>'ないしょ',
			    default_stdin_fh => $stdin_fh,
			    default_stdout_fh => $stdin_fh);

openしたファイルハンドルをcloseすると、Log4perlでログを書けなくなったので、closeはomitしています