[perl] pauze in bouwen werkt niet zoals het hoort

Pagina: 1
Acties:

  • DaFearLess
  • Registratie: Juni 2001
  • Niet online
Ik heb de volgende perl code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/perl

use IO::Socket;

$| = 1 ;

$server    = "192.168.0.1" ;
$port        = 6667 ;
$nick        = "statserv" ;
$host        = "statserv.fearnet.nl" ;
$pass        = "3kkdzoeh" ;

&connect ;

sub connect {
      while (1) {
            $iaddr = inet_aton($server);
            $paddr = sockaddr_in($port, $iaddr);
            $proto = getprotobyname('tcp');
            socket(IRC_SOCK, PF_INET, SOCK_STREAM, $proto) or die "[ERROR] kan socket niet maken: $!\n";
            connect(IRC_SOCK, $paddr) or die "[ERROR] Kan geen Verbinding maken met $server:$port \nError: $!\n\n" ;
            &login;
            &join ;
            while (<IRC_SOCK>) {
                &parse($_);
            }
            close IRC_SOCK;
            $login = undef;
            sleep(2);
      }
}

sub login {
      raw("NICK $nick");
      raw("USER $nick $host $server :$nick");
      raw("NICKSERV identify $pass");
      sleep 1;
      raw("OPER $nick $pass") ;
}

sub raw {
      select(IRC_SOCK);
      $| = 1;
      print IRC_SOCK "$_[0]\n";
} 

sub parse {
   chop($_);
   chop($_);

   if (/^PING \:(.+)/) {
      raw("PONG :$1");
   }
  
   &stats ;

   if (/^\:(.+?) 265 /) {
      open(LOG, ">log");
      @stat = split /\:/ ;
      print LOG "##### /USERS #####\n" ;
      print LOG "$stat[2] $stat[3] $stat[4]\n" ;
      close(LOG) ;
   }
   if (/^\:(.+?) 266 /) {
      open(LOG, ">>log");
      @stat = split /\:/ ;
      print LOG "$stat[2] $stat[3] $stat[4]\n" ;
      print LOG "##### /LIST #####\n";
      close(LOG) ;
   }
   if (/^\:(.+?) 322 /) {
      open(LOG, ">>log");
      @stat = split /\s/ ;
      print LOG "$stat[3] $stat[4]\n" ;
      close(LOG) ;
   }
} 

sub join {
      raw("JOIN #services.log");
      raw("PART #fearnet");
}

sub stats {
      raw("USERS");
      raw("LIST >0");

}

het enigste wat de bovenstaande code doet is iedere keer het commando /users en /list uit voeren op IRC en dat een een log file schrijven, dat doet hij goed.
alleen hij doet het achter mekaar,

nu wil ik dat hij dat 1x in de 20 minuten doet.
maar als ik er een sleep 1200 ; tussen zet dan doet hij maar om de 20 min een regel schrijven in het desbetrefende log filetje.

weet iemand of hier een appart commando voor is anders dan sleep? of een andere handig commandotje dat het loggen toch doorgaat?

specs : http://specs.tweak.to/7435


Verwijderd

:? Je wilt dat hij 1 keer in de 20 minuten in een logbestand schrijft? En als je hem op sleep 120 zet dan schrijft hij maar 1 keer in de 20 minuten. Ja logisch, wat wil je dan?

Verder ruikt dit naar threads.

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
tip:

net::irc ? :)

Verwijderd

Ruim eerst die code is op :)

my $http = new IO::Socket::INET(
PeerAddr => $target,
PeerPort => '80',
Proto => 'tcp',
Timeout => $timeout
);
print $http etc. ziet er al n stuk schoner uit :)

Voorde rest zodra ik begrijp wat je nou precies wilt zal ik wel even n example proggen.

Verwijderd

Hier heb je een alarm routine die ik in de gouwigheid even geschreven heb.

K hoop dat dit is wat je zocht. Bedank yarv maar voor het wijzen op deze posting.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl
# eval the block to be on the save side.
eval {
# setup signal handler
# this is were we go, if an alarm goes off.
    
    local $SIG{ALRM} = sub {
      print "Got hit\n"; 
      undef( $alarmset );       
      alarm(0);
    };
    
    
    while (1) { # loop forever 
      # check if an alarm hase gone off.
      # if so, we set up a new one. the alarm(5) gives 4 seconds  
      # from the perl manpages
      # alarm(SECONDS)
      # alarm SECONDS
      # Arranges to have a SIGALRM delivered to this process after the specified number of seconds (minus 1, actually) have
      # elapsed. Thus, alarm(15) will cause a SIGALRM at some point more than 14 seconds in the future. Only one timer may  
      # be
      # counting
      # at once. Each call disables the previous timer, and an argument of 0 may be supplied to cancel the previous timer
      # without
      # starting a new one. The returned value is the amount of time remaining on the previous timer.
      
      if ( !$alarmset ) { $alarmset = "1"; alarm(5) }
      # >PASTE CODE HERE!<      
      sleep(100);
    }
  
};

print "somthing realy bad happend\n";