[Linz-pm] IO::Socket::INET und open

WFB wbiker at gmx.at
Fri May 31 04:38:53 PDT 2013


Hallo, zusammen!

Ich stecke gerade fest und weiß nicht mehr weiter, so dachte ich mir
schreie ich doch gleich hier mal um Hilfe.

Die Umgebung:
Ich habe in der Arbeit mehrere Testrechner die automatisierte Tests fahren.
Ab und zu ist es aber notwendig auf allen Maschinen Arbeiten durchzuführen,
was dann meist wieder durch Scripts erledigt wird (SVN checkout, kopieren
von files...).

Die Idee:
Um nicht immer von Rechner zu Rechner laufen zu müssen um File XY zu
kopieren, dachte ich mir da muß eine Perllösung her. Die Idee war das Perl
auf einem Port lauscht und von dort dann auf Jobs wartet, wie starte script
XY.

Das Problem:
So weit so gut. Der Server lief recht schnell, aber wie die Scripte
starten. Dazu benutze folgenden Code:

sub start_script {
my ($script, $interpreter) = @_;
 my $cmd;
if($interpreter && $script) {
$log->info("Start '$interpreter' with '$script'");
 $cmd = $interpreter." ".$script;
}
elsif ($script){
$log->info("Start '$script'");
$cmd = $script;
}
        else {
                 $log->logcroak("nothing to start!");
                 return;
        }
 # create temp file for the error output
my $tempfh = File::Temp->new(UNLINK => 0, SUFFIX => '.dat');
my $tempFilename = $tempfh->filename();
 # assemble command with stderr and stdin redirection.
$cmd = "$cmd 2>$tempFilename";
$log->debug("start: '".$cmd."'");
 # start script. ATM without timeout
open(my $scriptFH, "-|", $cmd) or $log->logcroak("Could not start script:
$cmd");
binmode $scriptFH, ":utf8";
my $stdout = join "", <$scriptFH>; # join initialized the variable with ""
if nothing comes from readline (<>)
close($scriptFH);
 my $exitCode = $?;
 my $stderr = slurp($tempFilename);
 return ($stdout, $stderr, $exitCode);
}

Das funktioniert für sich genommen so wie erwartet. In meinem Serverscript
allerdings kommt immer die Fehlermeldung:
The process cannot access the file because it is being used by another
process

Der ExitCode is dann 256 und $stdout und $stderr ist immer leer.
Die Fehlermeldung wird auf der commandline immer auf STDERR ausgegeben.
Nach einigem Herumprobieren scheint es diese Zeile zu sein die den Fehler
produziert:
my $stdout = join "", <$scriptFH>;

Hat jemand eine Ahnung was da passiert? Wie gesagt, kopiert in ein extra
File tut der Code was er soll.
Das Serverscript tut aber nichts anderes als diese Funktion aufzurufen, ich
kann mir nicht erklären was das Problem verursacht.
Der Serverthread ist auch single-threaded. Also kein Fork oder ähnliches
der einen neuen Process erzeugen würde (war für die Zukunft geplant).

Danke,
Wolfgang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/linz-pm/attachments/20130531/16dbec88/attachment.html>


More information about the Linz-pm mailing list