Torsten: Im Perl-Script java-Programm starten

Hallo Leute,

ich habe ein jar-File, führt man es aus, startet es ein Programm, welches einen Installationsstand aktuallisiert und gegenbenfalls verbessert. Hierzu wird über die Konsole mit dem Benutzer kommunizert, in diesem Sinne, das der Nutzer Angaben über den Server geben muß und jede Reparatur bestätigen soll.

Soweit sogut.

Für das ganze soll ich nun eine Oberfläche für den BRwoser gestalten. Hierfür habe ich mir überelgt, das ganze in einem Perl-CGI-Script zu relaisieren.

Jedoch fangen die Proleme schon an, ich bekomme nicht mal das Programm zum starten.

Wer kann mir helfen? Was mache ich verkehrt? Wo finde ich eventuell gutes online-Material zum Starten von Jar-Dateien aus einem CGI-Script und Parsen und bearbeiten und zurücksenden der Konsolenausgaben?

Hier mein bisheriegen Script:

#!/opt/gnu/bin/perl

#!/usr/bin/perl

header();
startFile();
footer();
exit;

#######################################################

sub startFile{
print '<h1>Schleifendurchlauf</h1>';
my $call="/.../test.sh";
print qq{
<br>Programm wurde mit diesem Aufruf gestartet:
<table><tr><td bgcolor="#99FFFF"><pre>$call</pre></td></tr></table>
<br>Folgende Ausgaben wurden produziert:<br>
};

my @output=$call;
print '<table><tr><td bgcolor="#99FFFF"><pre>';
print 'TEST <br>';
foreach (@output){
print $_."<br>";
}
print "</pre></td></tr></table>";
}

sub header{
print $q->header;
print qq{
<HTML>
<HEAD>
<STYLE type="text/css">
<!--
BODY {text-decoration:none;font-weight:normal;font-family:Arial;font-size:10pt;line-height:10pt;text-align:left;color:#000000;}
TD {text-decoration:none;font-weight:normal;font-family:Arial;font-size:10pt;line-height:10pt;text-align:left;vertical-align:center;color:#000000;}
//-->
</STYLE>
<TITLE>ProgrammXYZ WebGUI</TITLE>
</HEAD>
<BODY>
<span style="background-color:#FFFF40;"><b > BETA Version !</b> Bei Problemen bitte an ... wenden.</span>
<hr noshade size=1>
<b><u>Programm XYZ WebGUI</u></b><br><br>
};
}

HTML footer

sub footer{
print qq{
<br>
<hr noshade size=1>
entwickelt von ...</a>
};
print $q->end_html;
}

MFG
TOrsten

  1. Moin!

    ich habe ein jar-File, führt man es aus, startet es ein Programm, welches einen Installationsstand aktuallisiert und gegenbenfalls verbessert. Hierzu wird über die Konsole mit dem Benutzer kommunizert, in diesem Sinne, das der Nutzer Angaben über den Server geben muß und jede Reparatur bestätigen soll.

    Für das ganze soll ich nun eine Oberfläche für den BRwoser gestalten. Hierfür habe ich mir überelgt, das ganze in einem Perl-CGI-Script zu relaisieren.

    Per Relais also ;-) Wie kommen denn vom Browser die Antworten auf die Fragen, die das Programm stellt, an selbiges?

    Hier mein bisheriegen Script:

    #!/opt/gnu/bin/perl

    #!/usr/bin/perl

      
    Wieso notierst du denn zwei Shebang-Zeilen? Eine reicht doch vollkommen aus.  
      
    
    > ~~~perl
    
    header();  
    
    > startFile();  
    > footer();  
    > exit;  
    >   
    > #######################################################  
    >   
    > sub startFile{  
    > print '<h1>Schleifendurchlauf</h1>';  
    > my $call="/.../test.sh";  
    > print qq{  
    > <br>Programm wurde mit diesem Aufruf gestartet:  
    > <table><tr><td bgcolor="#99FFFF"><pre>$call</pre></td></tr></table>  
    > <br>Folgende Ausgaben wurden produziert:<br>  
    > };  
    >   
    > my @output=`$call`;
    
    

    Du meinst also, dass dieser Aufruf hier fehlschlägt? Wie wäre es dann einmal die Variable $! zu prüfen oder nachzuschauen, was /.../test.sh macht – bist du dir eigentlich sicher, dass test.sh in diesem Verzeichnis, dem Root-Verzeichnis, zu finden ist?

    print '<table><tr><td bgcolor="#99FFFF"><pre>';

    print 'TEST <br>';
    foreach (@output){
    print $_."<br>";
    }
    print "</pre></td></tr></table>";
    }

      
    Viele Grüße,  
    Robert
    
    1. Per Relais also ;-) Wie kommen denn vom Browser die Antworten auf die Fragen, die das Programm stellt, an selbiges?

      DIe Antworten sollten, wenn möglich auch über das Script an das Java-Programm gegeben werden. Wie gesagt, hier handelt es sich um einfeache Konsolenein und -ausgaben.

      header();

      startFile();
      footer();
      exit;

      #######################################################

      sub startFile{
      print '<h1>Schleifendurchlauf</h1>';
      my $call="/.../test.sh";
      print qq{
      <br>Programm wurde mit diesem Aufruf gestartet:
      <table><tr><td bgcolor="#99FFFF"><pre>$call</pre></td></tr></table>
      <br>Folgende Ausgaben wurden produziert:<br>
      };

      my @output=$call;

      
      >   
      > Du meinst also, dass dieser Aufruf hier fehlschlägt? Wie wäre es dann einmal die Variable `$!`{:.language-perl} zu prüfen oder nachzuschauen, was /.../test.sh macht – bist du dir eigentlich sicher, dass test.sh in diesem Verzeichnis, dem Root-Verzeichnis, zu finden ist?  
      
      die ... stehen für den genauen Pfad zu test.sh. Und das Script startet das eigentliche Java-Programm und funktioniert per Hand ausgeführt tadellos.  
        
      Dies sind meine Anfänge in der cgi-Programmierung in Verbidung mit dem Start eines Java-Programms. Deswegen stehe ich komplett auf dem Zeiger.  
        
      MFG  
      Torsten
      
      1. Moin!

        […] Wie kommen denn vom Browser die Antworten auf die Fragen, die das Programm stellt, an selbiges?

        DIe Antworten sollten, wenn möglich auch über das Script an das Java-Programm gegeben werden. Wie gesagt, hier handelt es sich um einfeache Konsolenein und -ausgaben.

        Das sagst du so einfach! Damit dein Perlprogramm nicht nur aus die Ausgabe deines Javaprogrammes lesen kann, sondern auch Eingaben an dieses weiterreicht, musst du schon eine Schreib-Lese-Pipe zu diesem Öffnen. Wie man das allerdings in Perl bewerkstelligt, weiß ich nicht, aber vielleicht hilft dir Perls perlipc-Handbuch weiter.

        my @output=$call;

        Du meinst also, dass dieser Aufruf hier fehlschlägt? Wie wäre es dann einmal die Variable $! zu prüfen oder nachzuschauen, was /.../test.sh macht – bist du dir eigentlich sicher, dass test.sh in diesem Verzeichnis, dem Root-Verzeichnis, zu finden ist?

        die ... stehen für den genauen Pfad zu test.sh. Und das Script startet das eigentliche Java-Programm und funktioniert per Hand ausgeführt tadellos.

        Hast du in einem Perlprogramm einmal $! ausgewertet, was ich geschrieben habe? Diese Variable enthält die Meldung des zuletzt aufgetretenen Fehlers. Es könnte auch daran liegen, dass du per Shell Umgebungsvariablen, z.B. CLASSPATH oder PATH setzt, die im Perlprogramm nicht existieren und deshalb das Javaprogramm muckt. Aber du kannst ja einmal den obigen Aufruf ändern:

        my @output=/pfad/zu/java programm;

        /pfad/zu/java ist der komplette Pfad deiner Java-VM, normalerweise etwas wie /usr/bin/java; programm ist dabei der Name deines Javaprogrammes – ggf. musst du vorher noch in dessen Verzeichnis wechseln. Damit hättest du den Aufruf per Konsole nachgebaut.

        Viele Grüße,
        Robert

        1. Hallo,

          ich habe die Variabel $! ausgegeben, doch sie ist leer, ohne Inhalt.

          DIe Umgebungsvariablen, welche benötigt werden, werden in der test.sh gesetzt sowie die clathpath-Pfade und andere Notwenidgkeiten, für das Java-Programm. Deswegen soll das CGI-Script ja die test.sh ausführen. Jedoch geht da irgend was schief, und das ohne Fehlermeldung.

          Welche anderen Möglichkeiten hätte ich denn, das zu realisieren?

          MFG
          Torsten

          1. Könnte es eventuell auch daran liegen, dass kein Output kommt, da das Programm nicht beendet wird sondern auf eine Eingabe des Nutzers wartet?

            MFG
            Torsten

            1. Ich habe das Script jetzt soweit, dass es das Programm startet, jedoch wie von dir geschrieben nur bis zum ersten Konsoleninput des Nutzers.

              Komme ich hier mit Perl wirklich weiter?

              MFG
              Torsten

              1. Moin!

                Ich habe das Script jetzt soweit, dass es das Programm startet, jedoch wie von dir geschrieben nur bis zum ersten Konsoleninput des Nutzers.

                Dann stimmt also das, was ich mir schon gedacht und du im vorherigen Posting geäußert hast: Das Javaprogramm wartet auf eine Eingabe.

                Komme ich hier mit Perl wirklich weiter?

                Eventuell bringt dich tatsächlich die Perl-Handbuchseite perlipc weiter; du willst nämlich eigentlich eine Schreiblese-Pipe zu deinem Javaprogramm öffnen. Wenn nicht, könntest du – sofern du den Quellcode des Javaprogramm hast – dieses so umschreiben, dass alle Antworten auch per Kommandozeile übergeben werden könnten.

                Viele Grüße,
                Robert

  2. Hallo,

    ich habe ein jar-File, führt man es aus, startet es ein Programm, welches einen Installationsstand aktuallisiert und gegenbenfalls verbessert. Hierzu wird über die Konsole mit dem Benutzer kommunizert, in diesem Sinne, das der Nutzer Angaben über den Server geben muß und jede Reparatur bestätigen soll.

    Soweit sogut.

    offengestanden ist dort auch schon Ende der Fahnenstange! Im Gegensatz zum Betriebssystem, welches den Konsolenprozess "am Leben erhält" solange das Programm nicht geschlossen wird, arbeitet der Server das Script ab, bringt zur Ausgabe, was das Script an Ausgabe erzeugt und wartet nun so lange, bis das Script sich beendet, jedoch ohne weitere Eingaben des Users entgegen zu nehmen.

    Es muß also eine andere, wesentlich komplexere Möglichkeit genutzt werden, wie der Scriptprozess mit User-Interaktionen versorgt wird und diese (bzw. die Ausgaben) mittels Server dem User erreichen.

    Für das ganze soll ich nun eine Oberfläche für den BRwoser gestalten. Hierfür habe ich mir überelgt, das ganze in einem Perl-CGI-Script zu relaisieren.

    Warum nutzt Du Perl? (Hast Du noch andere Möglichkeiten?)

    Jedoch fangen die Proleme schon an, ich bekomme nicht mal das Programm zum starten.

    Bitte mach sachdienliche Angaben zum System und eingesetzten Webserver und suche nach dem Interpreter.

    Gruß aus Berlin!
    eddi

    --
    Wer Rechtschreibfehler findet, darf sie behalten.
    1. Mir fällt da keine andere Möglichkeit außer die eines cgi-Scriptes ein. Ich habe bis jetzt immer nur "normale" Programme implementiert. Jedoch noch keine Web-Anwendungen dieser Art.

      Welche Möglichkeiten hätte ich denn, die Kommunikation eines Jar-Files über die Konsole mit dem Nutzer über einen Browser zu realisieren?

      Der Browseraufruf erfolgt mit dem IE von Windows XP heraus.
      Das script befindet sich auf einem Server mit BS Solaris. Der Zugriff vom Browser auf den Server funktioniert, habe dies schon mit einfachen Cgi-Scripten getestet.

      MFG
      Torsten

      1. Re:

        Das script befindet sich auf einem Server mit BS Solaris.

        *NIX gut

        Mir fällt da keine andere Möglichkeit außer die eines cgi-Scriptes ein. Ich habe bis jetzt immer nur "normale" Programme implementiert. Jedoch noch keine Web-Anwendungen dieser Art.

        Aha - dann wirst Du sicher auch schon Prozesse abgespaltet (fork()). Das wirst Du hier auch gebrauch (müssen). Nur leider kann ich Dir in Perl nicht weiterhelfen, vielleicht kümmert sich Bio darum ;)

        Welche Möglichkeiten hätte ich denn, die Kommunikation eines Jar-Files über die Konsole mit dem Nutzer über einen Browser zu realisieren?

        ------------------------
         |        Client        |
         |                      |
         |      (Browser)       |
         ------------------------
                   | |
              Transaktionen
                   | |
         ------------------------
         |       WebServer      |
         |                      |
         | (viele Kindprozesse) |
         ------------------------
                   | |
              Transaktionen
                   | |
         ------------------------       ----------       ----------------------
         |     Daemoclient      | <---> | Daemon | <---> | Shell-Java-Prozess |
         |                      |       ----------       ----------------------
         | (wechselnder K-Pro.) |
         ------------------------

        Per (Erst-)Aufruf müßte ein Daemonprozess erstellt (geforkt) werden. Dieser Kindprozess dient allen Weiteren webanfrageverarbeitenden Webserverkindprozessen als Daemon.
        Der Daemon startet das Java-Programm und wartet an einem Socket auf Anfragen der Webserverkindprozesse.

        Eine andere Möglichkeit wäre den Daemonprozess soweit auszubauen, das er als eigener Webserver die Anfragen an einem anderen Port direkt vom Browser entgegennehmen kann. Dann könnte man mittels Applet Transaktionen realisieren. (Java Kommt doch eh schon zum Einsatz und der IE ist für sowas auch immer zu haben.;)

        Das ist schon ein ganz schöner Zirkus, der da veranstaltet werden muß. In PHP wüßte ich was ich bräuchte und wie ich es programmieren würde, daher fragte ich, ob Du noch andere Möglichkeiten hast.

        (Programmierst Du nur Java? Sonst kann auch ein "normales" Programm in C per CGI ebenso ausgeführt werden. [http://www.pronix.de/pronix-635.html ff.])

        Gruß aus Berlin!
        eddi

        --
        Wer Rechtschreibfehler findet, darf sie behalten.
        1. Hallo,

          PHP habe ich nocht nicht gemacht, C programmiere ich auch.

          Soviel ich weiss, ist PHP ja dem Perl ganz ähnlich, oder?

          MFG
          Torsten

          1. Re:

            PHP habe ich nocht nicht gemacht, C programmiere ich auch.
            Soviel ich weiss, ist PHP ja dem Perl ganz ähnlich, oder?

            Dann hielte ich es für sinnvoll, wenn Du auch bei den Mitteln (in dem Fall C) bleibst, die Du beherrscht statt jetzt mit einer neuen Sprache anzufangen. CGI ist nur ein Schnittstelle, die sich auch durch C realisieren läßt.
             Und zu Deiner Frage: Oder! PHP ähnelt syntaktisch eher C.

            Gruß aus Berlin!
            eddi

            --
            Wer Rechtschreibfehler findet, darf sie behalten.