Sebastian: einfache batch-Datei ausführen und Rückmeldung

Meine Suche im Forum brachte mir keine Ergebnisse, vielleicht liegt es aber auch nur daran dass meine cgi-Kenntnisse sich auf recht niedrigem Niveau (Bodenniveau-bin Chemiestudent) bewegen. Entschuldigung wenn es eigentlich kein Problem ist:
Ich habe auf einem Apache-Server (unter Windows)  im cgi-Verzeichnis eine einfache exe-Datei zu liegen. Diese möchte ich ausführen per cgi - das habe ich auch schon geschafft. Allerdings bekomme ich dann immer eine 500er Fehlermeldung obwohl das Programm läuft. Ich will nun das ganze so umstellen dass das eine Batch-Datei übernimmt, die zum einen
-die exe startet,
-eine Datei auf dem Server löscht und
-dann eine Meldung an den Client zurück gibt.
Die ersten beiden Sachen gehen ja rel. einfach, DOS-Befehle kenn ich. Aber wie gebe ich die Meldung an den Client aus?  Bitte gebt mir einen Tip, mein Labor-Ing will morgen Ergebnisse sehen!!!!

  1. Hi,

    Allerdings bekomme ich dann immer eine 500er Fehlermeldung

    an _genau_ dieser Stelle gibt es exakt eine Sache für Dich zu tun: Im Error-Log des Servers nachsehen. Mache dies zu einem Pawlow'schen Reflex.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Sebastian,

    Allerdings bekomme ich dann immer eine 500er Fehlermeldung obwohl das Programm läuft.

    Ich tippe daruf, dass Dein Script die Header-Ausgabe nicht beendet. Eine Leerzeile am Anfang der Ausgabe dürfte reichen.

    Viele Grüße,
    Christian

  3. Erst einmal Danke für die schnellen Antworten!

    Die Fehlermeldung kommt wohl dadurch zustande das ich die exe einfach so aufrufe, dabei handelt es sich um ein einfaches DOS-Programm.  Ich füg mal die Zeile ein:

    <p><a href="../cgi-bin/example.exe?1">Pumpe STARTEN</a></p>

    Soweit so gut, nur soll statt der example.exe eine start.bat (ohne weitere Argumente) ausgeführt werden, die ausführt:

    #!/usr/bin/perl -w

    del /q C:\Temp\status.log  -->Löscht die Datei
    example.exe 1                       -->Schaltet Pumpe ein, exe liegt im cgi-Verzeichnis

    print "Content-type: text/html\n\n";
    print "<html><head><title>Erfolg</title><body>";
    print "Alles gut gegangen"</body></head></html>"; -->soll den Text ausgeben

    1. Hi,

      Die Fehlermeldung kommt wohl dadurch zustande

      nicht raten, sondern im Error-Log nachsehen. Alles andere macht *nicht den geringsten Sinn!*

      #!/usr/bin/perl -w
      del /q C:\Temp\status.log  -->Löscht die Datei
      example.exe 1                       -->Schaltet Pumpe ein, exe liegt im cgi-Verzeichnis

      Das übrigens auch nicht. Wer hat Dir Perl beigebracht? Bzw. warum glaubst Du, Dein Aufruf würde zu dieser Datei führen?

      Cheatah

      --
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. hallo Cheatah,
        die batch-Datei wird auf jeden Fall schon mal ausgeführt. Die Datei in dem Verzeichnis ist danch  gelöscht und  die Pumpe wird angeschaltet. Nur eine Ausgabe bekomme ich nicht, es wird mir  im Browser folgendes angezeigt:

        p:\apache\apache\cgi-bin>#!/usr/bin/perl -w
        p:\apache\apache\cgi-bin>del /q C:\Temp\status.log
        p:\apache\apache\cgi-bin>example.exe 1
        Start USB Access Beispiel!
        OpenCleware found 1 devices
        p:\apache\apache\cgi-bin>print "Content-type: text/html\n\n";
        Datei Content-type: text/html\n\n; wurde nicht gefunden.
        p:\apache\apache\cgi-bin>print "<html><head><title>Erfolg</title><body>";
        Datei <html><head><title>Erfolg</title><body>; wurde nicht gefunden.
        p:\apache\apache\cgi-bin>print "Alles gut gegangen"</body></head></html>";

        Das error-log von apache zeigt mir nach Aufruf der Batch-Datei  folgende Fehlermeldung an:

        [Mon Sep 01 14:25:30 2003] [error] [client 127.0.0.1] Der Befehl "#!" ist entweder falsch geschrieben oder
        [Mon Sep 01 14:25:30 2003] [error] [client 127.0.0.1] konnte nicht gefunden werden.
        [Mon Sep 01 14:25:30 2003] [error] [client 127.0.0.1] "<" ist syntaktisch an dieser Stelle nicht verarbeitbar.

        Heißt das, ich sollte a. #! weglassen und b. habe mich noch irgendwo verschrieben und bin damit vom logische her schon auf dem richtigen Weg?

        1. Hi,

          die batch-Datei wird auf jeden Fall schon mal ausgeführt.

          langsam verstehe ich: Es handelt sich um eine *.bat-Datei auf einem Windows-System, richtig?

          [Mon Sep 01 14:25:30 2003] [error] [client 127.0.0.1] Der Befehl "#!" ist entweder falsch geschrieben oder

          Dein Windows erkennt beim Ausführen der Datei nicht, dass es sich um Perl handelt[1], sondern versucht, Batch-Befehle zu interpretieren. Diese haben mit Perl-Befehlen nichts gemein.

          Heißt das, ich sollte a. #! weglassen und b. habe mich noch irgendwo verschrieben und bin damit vom logische her schon auf dem richtigen Weg?

          Entscheide Dich bitte, welche Sprache Du verwenden möchtest. Konfiguriere Deinen Server ggf. entsprechend.

          Cheatah

          [1] Was allerdings auch nicht viel bringen würde, da Dein Script weder Fisch noch Fleisch (sprich: weder Perl noch Batch) ist.

          --
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Hast ja recht, ich Dummerchen ;-)
            Frage ist für mich jetzt nur noch wie ich eine Antwort verschicke an den Client... Kann ich das denn irgendwie durch die Windows-Batch machen?

            1. Hi,

              Frage ist für mich jetzt nur noch wie ich eine Antwort verschicke an den Client...

              eine "Antwort an den Client" ist die simple Ausgabe von Text nach STDOUT, welcher der CGI-Schnittstelle entsprechen - also mit einem gültigen HTTP-Header beginnen muss.

              Cheatah

              --
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
    2. Hi,

      Soweit so gut, nur soll statt der example.exe eine start.bat
      #!/usr/bin/perl -w

      Anhand dieser Zeile würde ich mal vermuten, dass start.bat ein Perl-Skript ist.

      del /q C:\Temp\status.log  -->Löscht die Datei
      example.exe 1                       -->Schaltet Pumpe ein, exe liegt im cgi-Verzeichnis

      Welche Möglichkeiten du hast, um in Perl Systemprogramme auszuführen, findest du hier:
      http://selfhtml.teamone.de/cgiperl/funktionen/systemaufrufe.htm, insbesondere exec und system.

      Viele Grüße
      Torsten

      1. Es ist wohl so, dass ich da in meiner Unkenntnis verschiedene Sachen in einen Topf geworfen habe:
        Ich dachte, das es ausreichen würde eine batch-Datei zu schreiben mit den DOS-Befehlen und diese dann per html-Aufruf ausführen zu lassen. Das da noch Perl dazwischen kam, ist nicht beabsichtigt. Lasse ich also den print-Teil und den Header weg. Einzige Frage ist für mich jetzt nur, wie kann ich die batch-Datei (also nur del und exe-Aufruf) aufrufen und mir durch diese nicht den Text:

        p:\apache\apache\cgi-bin>del /q C:\Temp\status.log

        p:\apache\apache\cgi-bin>example.exe 1
        Start USB Access Beispiel!
        OpenCleware found 1 devices

        ausgeben lassen sondern einen von mir vorgfertigten oder meinetwegen eine bestimmte Seite?
        Programmieren an sich in Perl oder anderen wollte ich wegen Unkenntnis außen vorlassen dabei.

        1. Hi,

          Einzige Frage ist für mich jetzt nur, wie kann ich die batch-Datei (also nur del und exe-Aufruf) aufrufen und mir durch diese nicht den Text [...] ausgeben lassen

          Aus meinen Anfängertagen am PC ist mir da noch @echo off in Erinnerung, versuchs mal damit in der ersten Zeile.

          sondern einen von mir vorgfertigten oder meinetwegen eine bestimmte Seite?

          Ohne weitere Details zu kennen, könntest du eine Erfolgsseite (erfolg.html) bauen und diese aufrufen (z.B. "c:\windows\iexplore.exe c:\verzeichnis\erfolg.html"). Vielleicht geht's ja so.

          Viele Grüße
          Torsten

  4. @TorstenA

    echo off schaltet die blöden Pfadangaben aus, soweit so gut. Aber die Webseite ruft er ja lokal dem Server auf, nicht auf dem Client, das geht leider nicht.

    1. Hi,

      echo off schaltet die blöden Pfadangaben aus, soweit so gut. Aber die Webseite ruft er ja lokal dem Server auf, nicht auf dem Client, das geht leider nicht.

      Von der Kombination Batch/CGI habe ich keine Ahnung, ich habe da bei deinem Ausgangsproblem wohl was überlesen. Sorry.

      Viele Grüße
      Torsten

    2. Hi,
      ich blicke jetzt zwar nicht mehr so ganz durch, ob du nun überhaupt noch eine DOS batch aufrufen willst, wenn ja, dann wäre eine über diese batch generierte ausgabe aber leicht über den echo-befehl möglich:

      if exist ergebnis.txt del ergebnis.txt
      echo Alles klar...>ergebnis.txt

      wenn du dich mit batch-programmierung unter DOS auskennst, kannst du auch - je nach abzufragenden erfolg - verschiedene ausgaben machen.
      im endeffekt mußt du nach der aktion nur noch die ergebnisdatei anzeigen lassen - wie auch immer.

      Gruß
      Ingo

  5. Also:
    Mittlerweile habe ich mich mit dem gedanken abgefunden, das ich mit der Anzeige der DOS-Oberfläche leben muß. EIne letzte Idee, die mir noch einfiel ist folgende:

    Statt direkt die batch-Datei zu  starten, wird ein neues Framset geöffnet, bei dem statt der einen Frame-Seite automatisch die batch-Datei gestartet wird  und die andere ein paar nähere Erläuterungen dazu enthält. Im Code des Framesets ist ein kleines Javaskript enthalten, was das Frameset automatisch shclisßt nach einer gewissen Zeit. Wäre das praktikabel?

    1. Hi Sebastian,

      Mittlerweile habe ich mich mit dem gedanken abgefunden, das ich mit der Anzeige der DOS-Oberfläche leben muß.

      keineswegs - dem bereits gegebenen Hinweis in dieser Richtung scheinst Du nicht nachgegangen zu sein.

      Aber Du könntest in der Tat auch Perl dazwischen schalten und damit ebenfalls die Kontrolle über die erzeugten Ausgaben übernehmen; insbesondere hättest Du mit Perl eine wahrscheinlich genauere Möglichkeit, Fehlersituationen zu behandeln (was ist, wenn z. B. das Löschen der Datei scheitert?).

      Statt direkt die batch-Datei zu starten, wird ein neues Framset geöffnet

      Das erzeugt zusätzliche Behinderung der Benutzer, Browserabhängigkeiten (Frames und JavaScript sind ggf. abschaltbar; was ist mit Suchmaschinen?) und bringt Dir ansnonsten überhaupt nichts.

      Alles, was Du brauchst, ist
      a) das Verständnis über den Aufbau einer korrekten HTTP-Ausgabe und
      b) das Verständnis der von Dir zu verwendenden Programmiersprache (in Deinem Falle Windows-Batchfiles) und der darin vorhandenen Möglichkeiten zur Ausgabekontrolle. Selbst für diese Sprache gibt es eine Dokumentation.

      Viele Grüße
            Michael

      --
      T'Pol: I apologize if I acted inappropriately.
      V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
      (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
      Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
  6. So, nach einer durchgemachten Nacht an der Suchmaschine habe ich folgendes gemacht:

    #!perl

    $pumpe = 'example.exe';
    $para = '1';
    $ret= $pumpe $para;

    $loeschen = 'del';
    $para = '/q C:\Temp\status.log';
    $ret= $loeschen $para;

    print "Content-type: text/html\n\n";
    print "<html><head><title>Alte Datei gelöscht und Pumpe läuft</title></head>\n";
    print "<body><h1>Pumpe geht</h1>\n";
    print "</body></html>\n";;
    exit(0);

    Ist zwar nicht die eleganteste Lösung - gerade was die Lösch-geschichte angeht, aber es funktioniert immerhin. Habe auch nicht die geringste Ahnung was das $ret bedeutet, aber der Zweck heiligt mir hier die Mittel. Danke trotzdem für Eure zahlreichen Antworten!!

    1. Hi Sebastian,

      $ret= $pumpe $para;
      Habe auch nicht die geringste Ahnung was das $ret bedeutet

      das Entscheidende ist gar nicht das "$ret", sondern die `` um das Systemkommando herum.
      Damit "saugst" Du dessen Ausgabe an Dich - und verhinderst, daß sie vor dem eigentlichen HTTP-Header ausgegeben wird.
      Alternativ hättest Du natürlich den HTTP-Header zuerst ausgeben und erst danach Deine Systemkommandos ausführen können ...

      Viele Grüße
            Michael

      --
      T'Pol: I apologize if I acted inappropriately.
      V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
      (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
      Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
      1. Wieder was dazugelernt, dank Euch allen noch mal!