#! perl use File::Spec; use IO::Socket; use IO::Select; use Win32::API; use Win32; use Win32::Daemon; use Par::Heavy; use strict; use warnings; #use POSIX qw(:signal_h); my $programmpfad = $0; $programmpfad =~ s/[^\\]*?$//; use Win32::Daemon::Simple Service => 'Go Back!Up', Name => 'Go Back!Up Service', Version => 'RC2.0', Info => { display => 'Go Back!Up Service RC2.0', description => 'Backup Programm', interactive => '1', }, Params => { Tick => 0, Talkative => 0, Interval => 1, LogFile => "GoBackUp.log", Description => <<'*END*', Tick : (0/1) controls whether the service writes a "tick" message to the log once a minute if there's nothing to do Talkative : controls the amount of logging information Interval : how often does the service look for new or modified files (in minutes) LogFile : the path to the log file ... *END* }, param_modify => { #LogFile => sub {File::Spec->rel2abs($_[0])}, #tAlkative => sub {undef} }; ServiceLoop(\&doSomething); exit; sub doSomething { $SIG{'CHLD'} = 'IGNORE'; my $pid = fork(); if($pid == 0) { my $server = IO::Socket::INET->new( LocalPort => 2005, type => SOCK_STREAM, Reuse => 1, Listen => 10 ) or die "Server läuft nicht: $@\n"; my $select = IO::Select->new($server); while(my @readable = $select->can_read) { foreach my $socket (@readable) { if($socket == $server) { my $client = $socket->accept; print "New client connects\n"; $select->add($client); #$client->print("process still running\n"); } else { my $computername = $socket->getline; $computername =~ s!\r?\n$!!g; # Zeilenumbruch entfernen if (defined $computername) { chomp $computername; my $WindowAvailable =""; $WindowAvailable = FindWindow("$computername"); print "$WindowAvailable\n"; if ($WindowAvailable == 0) { #$client->print ("Window ist nicht vorhanden\n"); system "start \"$computername\" \"E:\\Daten\\Arbeit\\Perl-Scripte\\Go_Back!up\\RC_2.0\\Server_ver2.01.pl\""; #$socket->print("reconnect\n"); $socket->print("port=12346\n"); delete_socket($select, $socket); } else { $socket->print("process still running\n"); } } else { print "Client says: [$computername]\n"; delete_socket($select, $socket); } } } sub FindWindow { my $WindowName = shift(@_); chomp $WindowName; print "$WindowName"; my $FindWindow = new Win32::API('user32', 'FindWindow', ['P','P'], 'N');# or die print "$!"; my $name = 'Telnet 127.0.0.1'; my $class = 0; my $topHwnd = $FindWindow->Call($class, $WindowName); print "$topHwnd\n"; return $topHwnd; } sub delete_socket { my ($sel, $sock) = @_; $sel->remove($sock); $sock->close; } } } else { if (Win32::Daemon::State() == SERVICE_STOP_PENDING) { kill 'SIGKILL', $pid; Win32::Daemon::State(SERVICE_STOPPED); Win32::Daemon::StopService(); exit 0; } } }