#!/usr/bin/perl require 5.016_003; use strict; use warnings; use diagnostics; use Parallel::ForkManager 1.05; use POSIX 1.30 qw(WNOHANG); use IPC::Run 0.92 qw(start pump finish timeout harness); 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"; }, ); my $lauf = 1; while ($lauf) { print "Warte auf Auftraege\n"; if (opendir my $vh,$config->{data_pfad}) { foreach my $file ( sort {(stat("$config->{data_pfad}/$a"))[9] <=> (stat("$config->{data_pfad}/$b"))[9]} 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"; my ($in,$out,$err); my @prog = qw(gpg2 -h); my $handle = start(\@prog,\$in,\$out,\$err,10); pump $handle until length $out; sleep(1); $forkmanager->finish($pid); } else { die "Fehler, kann Sohnprozess nicht starten\n"; } } } $forkmanager->wait_one_child(WNOHANG); # sonst klappt das run_on_finish() nicht zeitnah sleep($config->{poll_interval}); $lauf = 0 if -f "$config->{data_pfad}/stop.dat"; } $forkmanager->wait_all_children; } else { die "Fehler, kann Konfigurationsdatei nicht oeffnen '$!'\n"; }