Thread Problem mit fork() (24 answers)
Opened by bianca at 2015-09-05 20:15

bianca
 2015-09-11 09:43
#182156 #182156
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Guten Morgen!
Nun wollte ich mittels eines Testscripts dem Perl v5.14.2 Hoster zeigen, wo das Problem liegt.
Leider ist es nun so, dass dieses Testscript auf dem Perl v5.18.4 Server nun auch nur noch ungefähr jedes fünfte mal wie erwartet reagiert. Das Original Script hingegen verhält sich auf dem v5.18.4 nach wie vor wie erwartet. Das ist eine völlig neue Situation.
Erwartet Reaktion:
Quote
Polling Ergebnisse:
Initialisierung wird ausgeführt...
1441957001 Hier ist der Vater, terminiere jetzt (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 ***Z-5-1441957006 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 ***Z-5-1441957006 ***Z-6-1441957007 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 ***Z-5-1441957006 ***Z-6-1441957007 ***Z-7-1441957008 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 ***Z-5-1441957006 ***Z-6-1441957007 ***Z-7-1441957008 ***Z-8-1441957009 (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441957001 ***Z-1-1441957002 ***Z-2-1441957003 ***Z-3-1441957004 ***Z-4-1441957005 ***Z-5-1441957006 ***Z-6-1441957007 ***Z-7-1441957008 ***Z-8-1441957009 ***Z-9-1441957010 (0 Sekunden)
Fertig


Stattdessen kommt häufig (und genau das ist das Problem) dieses:
Quote
Polling Ergebnisse:
Initialisierung wird ausgeführt...
1441956750 Hier ist der Vater, terminiere jetzt (0 Sekunden)
Polling wird ausgeführt...
***Z-0-1441956750 ***Z-1-1441956751 ***Z-2-1441956752 ***Z-3-1441956753 ***Z-4-1441956754 ***Z-5-1441956755 ***Z-6-1441956756 ***Z-7-1441956757 ***Z-8-1441956758 ***Z-9-1441956759 (0 Sekunden)
Fertig


Getestet mit Firefox 40.0.3 auf Win 7 durch ständiges STRG R nach der Meldung "Fertig". Ungefähr jedes fünfte mal ist es ok, dazwischen wie eine Art "Puffer".

Das Testscript benutzt exakt die selbe Syntax (sowohl Perl- wie auch JS-seitig) wie das Original bei dem mir der Fehler aufgefallen war und sieht so aus:
Code (perl): (dl )
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use JSON;
use Fcntl qw(:DEFAULT);
use IO::Handle;
STDOUT->autoflush(1);

my $pfad = '/mein_pfad_zum/cgi-bin';

my $t = time();

if (defined $ARGV[0]) {
    unlink("$pfad/test_fork.txt");
    if (sysopen(my $fh,"$pfad/test_fork.txt",O_WRONLY|O_APPEND|O_CREAT)) {
        $fh->autoflush(1);
        for (my $z = 0; $z < 10; $z ++) {
            print $fh "***Z-$z-".time()."\n";
            sleep(1);
        }
        close($fh);
    }
    exit();
}

my $cgi = new CGI;
my $parameter = $cgi->param('parameter');

if (!defined $parameter) {
    print STDOUT CGI->new->header(-charset=>'ISO-8859-15').<<HTML_TEIL
<!DOCTYPE html>
<html>
    <head>
        <title>fork() Fehler</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
        <style type="text/css">
            #fehler {
                padding-top:    20px;
                color:          red;
                font-weight:    bold;
            }
            #out {
                padding-top:    20px;
            }
        </style>
    </head>
    <body>
        <div id="fehler"><u>Fehler:</u></div>
        <div id="out"><u>Polling Ergebnisse:</u><br></div>
        <script>
            var ini = true;
            function aktualisieren() {
                document.getElementById('out').innerHTML += (ini ? 'Initialisierung' : 'Polling')+' wird ausgeführt...<br>';
                var datapostobj = {
                    parameter: (ini ? 'ini' : 'poll')
                };
                console.log('Start Ajax mit Parameter "'+datapostobj['parameter']+'"');
                jQuery.ajax({
                    url:        '/cgi-bin/test_fork.pl',
                    data:       datapostobj,
                    dataType:   'json',
                    type:       'POST',
                    cache:      false,
                    success:    function(input) {
                        console.log('Ergebnis ist da');
                        document.getElementById('out').innerHTML += (input['text'] != '' ? input['text'] : 'nix')+'<br>';
                        ini = false;
                        if (input['text'].indexOf('Z-9') < 0) {
                            window.setTimeout(function() { aktualisieren(); },1000);
                        }
                        else {
                            document.getElementById('out').innerHTML += 'Fertig<br>';
                        }
                    },
                    error:      function(xhrobj,textStatus,errorThrown) {
                        jQuery('#fehler').html('Verbindungsfehler textStatus: '+textStatus+' errorThrown: '+errorThrown);
                    }
                });
            }

            aktualisieren();
        </script>
    </body>
</html>
HTML_TEIL
;
}
elsif ($parameter eq 'ini') {
    my $pid = fork();

    # Fehler
    if (!defined $pid) {
        print STDOUT CGI->new->header(-charset=>'ISO-8859-15').time()." Fehler bei fork()\n";
    }

    # Vater
    elsif ($pid) {
        my %out = (text => time().' Hier ist der Vater, terminiere jetzt ('.(time() - $t)." Sekunden)\n");
        print STDOUT CGI->new->header(-charset=>'ISO-8859-15').JSON->new->encode(\%out);
    }

    # Sohn
    else {
        close STDIN;
        close STDOUT;
        exec("perl $pfad/test_fork.pl kommandozeile");
        exit();
    }
}
elsif ($parameter eq 'poll') {
    my %out = (text => '');
    if (sysopen(my $fh,"$pfad/test_fork.txt",O_RDONLY)) {
        undef local $/;
        $out{text} = <$fh>;
        close($fh);
    }
    else { $out{text} = "Fehler '$!'"; }
    $out{text} .= ' ('.(time() - $t)." Sekunden)\n";
    print STDOUT CGI->new->header(-charset=>'ISO-8859-15').JSON->new->encode(\%out);
}


@jan: ein Managed Server kann ich nicht bezahlen, hab ja keine Einnahmen damit.

Weiß jemand, warum das mal wie erwartet klappt und mal nicht?
Last edited: 2015-09-11 09:45:10 +0200 (CEST)
10 print "Hallo"
20 goto 10

View full thread Problem mit fork()