#!/usr/bin/perl use strict; use warnings; use File::Spec; my $gsc = File::Spec->rel2abs('wait.pl'); my $sleep=10; my $ein ='C:\Lokale Daten\vbv tiffs\Work\Spool'; my $aus ='C:\Lokale Daten\vbv tiffs\Work\Tiff'; # 10 Prozesse gleichzeitig starten my $max_run=10; my @cmd=($gsc,$sleep); # PID aller laufenden Kindprozesse my %running; # Kommandos die auf Ausfühung warten. my @waiting; # bendete Kindprozesse terminieren $SIG{CHLD}=sub{ my $pid=wait(); delete($running{$pid}); }; die("Error open $ein ($!)\n") unless (opendir(my $dh,$ein)); while (my $Eintrag = readdir($dh)) { my $infile = File::Spec->join($ein,$Eintrag); next if(-d $infile); if($Eintrag =~ /\.ps$/) { my $outfile = File::Spec->join($aus,$Eintrag.'.tif'); print "ADD $infile\n"; my @c=@cmd; push(@c,$infile); push(@c,$outfile); push(@waiting,\@c); } Start(\%running,\@waiting,$max_run); } closedir($dh); my $last=0; while(@waiting || %running) { Start(\%running,\@waiting,$max_run); select(undef,undef,undef,0.10); my $now=time(); if($now > $last+2) { $last=$now; print "TIME:".localtime()."\n"; print "WATITING FOR EXEC: ".@waiting."\n" ; print "PROCESSES RUNNING: ".keys(%running)."\n"; print "\n"; } for my $pid (keys(%running)) { next if(kill(0,$pid)); delete($running{$pid}); } } ######################################################################## ######################################################################## sub Start { my $run=shift; my $wait=shift; my $max=shift; while(keys(%$run) < $max) { return unless(@$wait); my $cmd=shift(@$wait); print "START: ".join(' ',@$cmd)."\n"; my $pid=fork(); die("Fork Failed $!\n") unless(defined($pid)); unless($pid) { exec(@$cmd); die("EXEC Failed"); } $run->{$pid}=1; } }