Perlscripts funktioniert nur bei Fehler!

P

Phill

Jungspund
Hallo, ich habe hier so ein ungewöhnliches Problem, dass mir noch nicht einmal ein sinnvoller Titel einfällt.

Also folgendes, ein Perl Script das per Apache2 über die CGI-Schnittstelle ausgeführt wird. In dem Script wird ein Shellprogramm ausgeführt was laufen bleiben soll (also als daemon). Das eigentliche Perl Script soll (muss) aber beendet werden, damit der Webbrowser die Rückgabe bearbeitet.
So ungefair:
Code:
system("daemon_programm.sh &");
print "alert('Programm gestartet!');";

Wenn ich es so mache wird der Perlprozess nicht beendet, und der Browser interpretiert nicht die Rückgabe, bis ich den daemon per hand beende und das Perlscript nicht mehr im Speicher ist.
Code:
 6624 ?        Z      0:00 [script.pl] <defunct>

Ich habe schon fork() probiert system("nohup programm &"); aber nichts klappt, außer:
Code:
system("daemon_programm.sh | dashierverstehichnicht &");
Wenn ich den Daemon an etwas was einen Fehler zurück gibt "peipe", wird das Perlscript nach der letzten Zeile beendet und der Browser interpretiert die Rückgabe.

Kann mir das einer erklären, und sagen wie ich es eigentlich richtig machen muss!
 
Code:
exec `nohup ./daemon.sh > daemon.out 2>&1 &`
auf die richtigen 'Backticks' achten (der Schwabe sagt auch Backslashle dazu :) )
 
Danke!

Das hat doch tatsächlich funktioniert, wenn ich statt normalen " ein ` nehme.
Code:
exec `nohup $command >/dev/null 2>&1 &`;
Kannst du mir das noch erklären! ?( "exec" beendet doch normalerweise das programm.
 
exec wird in diesem Fall wohl eher für "execute" (Sprich: ausführen) stehen.
 
Hi,
also da habe ich doch in der Hektik ziemlichen Blödsinn gepostet. Das hätte ich spätestens bei der Erläuterung gemerkt :))
Folgende drei Varianten sollten funktionieren:
Code:
exec ('nohup ./test.sh >test.log 2>&1 &')
system ('nohup ./test.sh >test.log 2>&1 &')
`nohup ./test.sh >test.log 2>&1 &`
die erste Variante (exec) wird nicht empfohlen, kannste ja mal nach googeln. die 2.Variante (system) ist auch Käse, da du ja den Rückgabewert des daemons gar nicht haben willst (und auch nicht bekommst). Ist ja in diesem Fall auch immer 0, falls der Daemon erfolgreich ausgeführt werden kann. Die backticks (Variante 3) reichen völlig aus.
Der Gag ist nur, dass der Daemon dein Terminal blockiert, wenn er keine eigene stdin und sterr hat, deshalb leitet man stdin mit ">test.log" in eine Datei um und stderr mit "2>&1" ebenfalls, dann geht der Daemon mit "&" in den Hintergrund. Das nohup vorneweg bewirkt, dass der Daemon auch dann weiterläuft, wenn der user sich vom System abmeldet.
 
Nochmal zu den Shell Umleitungen:
jede Shell macht standardmäßig 3 Datei Descriptoren auf:
0 stdin (Standardeingabekanal)
1 stdout (Standardausgabekanal)
2 stderr /Standardfehlerausgabekanal)
mit >test.log oder 1>test.log leitest du die Ausgabe in eine Datei um
mit 2>&1 leitest du Kanal 2 auf Kanal 1 um, also auch in die Datei
mit 2>test.err könntest du die Fehlermeldungen auch in eine separate Datei umleiten
mit 1>/dev/null 2>&1 schickst du beides ins Nirvana.
Google mal nach Shell Umleitungen, da gibt es recht ausführliche Beschreibungen.
Bye,
yai.
 
Also erst mal danke.
Macht es probleme wenn man die daemons nicht umleitet? nohub erstellt doch automatisch logs wenn nicht umgeleitet wird. Oder?

Aber das wirds gewesen sein das ich nicht umgeleitet habe... Komisch.

BTW:
Das es mit exec wie oben funktioniert liegt wohl daran das erst die backticks interpretiert werden und die zurückgegebene 0 von exec als parameter angenommen wird. Also "exec 0" wird wohl nichts tun also kann exec auch weg bleiben. Wie du bereits erwähnt hast.
 
Zuletzt bearbeitet:
So ich habe es jetzt nochmal getestet.
system("nohub befehl >/dev/null 2>&1 &"); geht
system("nohub befehl &"); geht nicht
besser gesagt geht, aber der hauptprozess wird blockiert.

:think:

das selbe mit backticks.
exec fällt weg da der hauptprozess ja leben bleiben soll.
 

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

sed im script per crontab

CGI laesst sich nicht ausfuehren

Zurück
Oben