#!/usr/bin/perl use strict; use warnings; use diagnostics; use Parallel::ForkManager 1.05; if (open(my $fh,'<','config.pl')) { my $config = eval do { local $/; <$fh>; }; die "Fehler, kann Konfigurationsdatei nicht verarbeiten '$@'\n" if $@; close($fh) or die "Fehler, kann Konfigurationsdatei nicht schliessen '$!'\n"; my $forkmanager = Parallel::ForkManager->new($config->{max_prozesse}); $forkmanager->run_on_start( sub { my ($pid,$file) = @_; print "Sohn '$pid' startet mit Datei '$file'\n"; }, ); $forkmanager->run_on_finish( sub { my ($pid) = @_; print "Sohn '$pid' ist beendet\n"; }, ); $forkmanager->run_on_wait( sub { print "Warte auf Auftraege\n" }, $config->{poll_interval}, ); my $lauf = 1; while ($lauf) { if (opendir my $vh,$config->{data_pfad}) { foreach my $file ( grep { $_ =~ /^[a-z0-9]+\-auftrag.dat$/ && !-z $_ } readdir $vh ) { print "Datei $file gefunden\n"; rename("$config->{data_pfad}/$file","$config->{data_pfad}/$file-erl"); my $pid = $forkmanager->start($file) and next; if (!$pid) { # Sohn print "Hier meldet sich ein Sohn von der Front\n"; $forkmanager->finish(); } else { die "Fehler, kann Sohnprozess nicht starten\n"; } } } $lauf = 0 if -f "$config->{data_pfad}/stop.dat"; } $forkmanager->wait_all_children; } else { die "Fehler, kann Konfigurationsdatei nicht oeffnen '$!'\n"; }