PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : perl cgi: Prozess im Hintergrund starten



SeeksTheMoon
29-12-2006, 15:09
Ich habe ein cgi, das ein Formular ausgibt. Wenn man die Daten abschickt, dann erstellt das cgi daraus eine pdf-Datei.
Das klappt alles.

Jetzt will ich einbauen, dass die pdf-Datei nach 15 Sekunden automatisch gelöscht wird, aber das cgi reagiert nicht wie es soll:
Wenn ich die Daten jetzt abschicke, dann lädt das cgi 15 Sekunden, zeigt dann den Output und das pdf ist natürlich weg, anstatt das sleep im Hintergrund zu machen.

Ich habe jetzt schon system("sleep+löschkommando &") ausprobiert, habe versucht die Ausgaben zu flushen und jetzt bin ich bei fork und exec angekommen und selbst dann führt er das sleep und löschen aus bevor er die Seite ausgibt:


print "<a href=\"../bla.pdf\">download</a>";
print $cgi->end_html();
my $pid = fork();
if($pid == 0) {
exec("perl -e \'sleep 15; unlink(\"../bla.pdf\");\'");
} else {
exit;
}


Wie soll das jetzt gehen? Ich hab keine Lust einen cronauftrag über perl anzulegen, der das macht.

reneeb
30-12-2006, 13:47
probier mal:
system("perl -e 'sleep 15; unlink $pdf' &");

wenn das nicht geht, mach ein kleines Perl-Skript, das nur das sleep und das löschen macht. Dann sollte es wie folgt gehen:

system("perl skript.pl $pdf &");

skript.pl
#!/usr/bin/perl

sleep 15;
unlink $ARGV[0];

SeeksTheMoon
31-12-2006, 07:34
leider funktioniert beides nicht, ich habs nochmal ausprobiert. Sobald ich auf Absenden klicke, wartet er 15 Sekunden, löscht das pdf und zeigt mir dann erst die Downloadseite

SeeksTheMoon
31-12-2006, 08:36
das muss irgenwas mit dem apachen sein. Ich habe ein C-Programm geschrieben, das forkt, alle signale ignoriert und nur den Kindprozess (d.h. schlafen und löschen der Datei) ausführt. Funktioniert auch, aber sobald ich das im Skript von mir einbinde, wird es sofort gekillt.

Ich hab jetzt einen regulären cronjob eingerichtet, der mir die Datei alle paar Minuten löscht. Das zu skripten ist mir zu blöd.