Perlscripts funktioniert nur bei Fehler!

Dieses Thema: "Perlscripts funktioniert nur bei Fehler!" im Forum "Ruby, php, Perl, Python ..." wurde erstellt von Phill, 06.04.2011.

  1. Phill

    Phill Jungspund

    Dabei seit:
    17.01.2008
    Beiträge:
    16
    Zustimmungen:
    0
    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!
     
  2. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    Code:
    exec `nohup ./daemon.sh > daemon.out 2>&1 &`
    auf die richtigen 'Backticks' achten (der Schwabe sagt auch Backslashle dazu :) )
     
  3. Phill

    Phill Jungspund

    Dabei seit:
    17.01.2008
    Beiträge:
    16
    Zustimmungen:
    0
    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.
     
  4. nighT

    nighT Guest

    exec wird in diesem Fall wohl eher für "execute" (Sprich: ausführen) stehen.
     
  5. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    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.
     
  6. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    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.
     
  7. #7 Phill, 17.05.2011
    Zuletzt bearbeitet: 17.05.2011
    Phill

    Phill Jungspund

    Dabei seit:
    17.01.2008
    Beiträge:
    16
    Zustimmungen:
    0
    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.
     
  8. Phill

    Phill Jungspund

    Dabei seit:
    17.01.2008
    Beiträge:
    16
    Zustimmungen:
    0
    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.
     
Thema:

Perlscripts funktioniert nur bei Fehler!

Die Seite wird geladen...

Perlscripts funktioniert nur bei Fehler! - Ähnliche Themen

  1. Nach Neustarten eines Perlscripts

    Nach Neustarten eines Perlscripts: bekomme ich es nicht mehr zum laufen sondern hab folgenden Fehler Bad arg length for Socket::pack_sockaddr_in, length is 0, should be 4 at...
  2. Samba 4.1.11 Domänen anbindung funktioniert nicht !!!

    Samba 4.1.11 Domänen anbindung funktioniert nicht !!!: Hallo liebe Ubixboard - User, ich hoffe ihr könnt mir helfen habe schon mehrere Foren durchstöbert und echt zahlreiche Tutorials angeschaut und...
  3. PHPmyAdmin login funktioniert nicht

    PHPmyAdmin login funktioniert nicht: Hallo zusammen, nachdem ich gestern meine PHP Version von 5.3 auf 5.4 geupdated habe, kann ich mich nicht mehr in PHPmyAdmin einloggen. Komisch...
  4. Tabs wiederherstellen funktioniert bei Firefox nicht

    Tabs wiederherstellen funktioniert bei Firefox nicht: Hallo, seit kurzem kann ich in Firefox keine geschlossenen Tabs wiederherstellen. Wenn ich auf den entsprechenden Button klicke, passiert...
  5. Automatisierung via Netzwerk funktioniert nicht richtig

    Automatisierung via Netzwerk funktioniert nicht richtig: Hey Leute, Habe da ein Problem das ich einfach nicht verstehe und wo ich auch nicht weis wonach ich suchen soll, folgender Code: #!/bin/bash...