Rol: Script unter WinXP im Hintergrund laufen lassen

Hi,

folgendes Problem:

Ein Perl Script soll auf einem PC (WinXP) währen der gesamten Einschaltzeit des Rechners neben anderen Programmen im Hintergrund laufen.

Eigentlich kein Problem, allerdings stört dem Anwender das DOS-Fenster (bzw. der Button in der Taskleiste) und insbesondere die Meldung beim herunterfahren des Rechners. Es arbeiten (dieses Verb ist hier eigentlich fehl am Platze ;-)) an diesem PC einige DAU's die bei jeder Alertmeldung nicht mehr weiter wissen.

Kennt jemand eine Möglichkeit, das Script "unsichtbar" auf dem PC laufen zu lassen.

Viele Grüße

Rol

  1. Halihallo

    Ein Perl Script soll auf einem PC (WinXP) währen der gesamten Einschaltzeit des Rechners neben anderen Programmen im Hintergrund laufen.

    Eigentlich kein Problem, allerdings stört dem Anwender das DOS-Fenster (bzw. der Button in der Taskleiste) und insbesondere die Meldung beim herunterfahren des Rechners. Es arbeiten (dieses Verb ist hier eigentlich fehl am Platze ;-)) an diesem PC einige DAU's die bei jeder Alertmeldung nicht mehr weiter wissen.

    Kennt jemand eine Möglichkeit, das Script "unsichtbar" auf dem PC laufen zu lassen.

    Über die Win-API von Perl kannst du einen neuen detached-Prozess starten, dann erscheint keine DOS-Box und der Prozess läuft völlig unsichtbar im Hintergrund. Schau dir hierzu mal die Win32 Module an. Vielleicht finde ich irgendwo noch ein Beispiel...

    Viele Grüsse

    Philipp

    1. Halihallo

      Über die Win-API von Perl kannst du einen neuen detached-Prozess starten, dann erscheint keine DOS-Box und der Prozess läuft völlig unsichtbar im Hintergrund. Schau dir hierzu mal die Win32 Module an. Vielleicht finde ich irgendwo noch ein Beispiel...

      bingo: Hatte da mal was gebastelt, um ein Perl Programm mit Parametern aufzurufen und als detached Prozess laufen zu lassen.

      #!/usr/bin/perl

      use strict;
      use Win32;
      use Win32::Process;

      Win32::Process::Create($Win32::Process::Create::ProcessObj,
       'c:\perl\bin\perl.exe',
       'perl '.join(' ', @ARGV),
       0,
       DETACHED_PROCESS,
       ".") or
      die print_error();

      sub print_error
      {
         return Win32::FormatMessage(Win32::GetLastError() );
      }

      Viele Grüsse und hoffentlich hilfts

      Philipp

      1. Hi Philipp,

        Über die Win-API von Perl kannst du einen neuen detached-Prozess starten, dann erscheint keine DOS-Box und der Prozess läuft völlig unsichtbar im Hintergrund.

        #!/usr/bin/perl

        use strict;
        use Win32;
        use Win32::Process;

        Win32::Process::Create($Win32::Process::Create::ProcessObj,
        'c:\perl\bin\perl.exe',
        'perl '.join(' ', @ARGV),
        0,
        DETACHED_PROCESS,
        ".") or
        die print_error();

        sub print_error
        {
           return Win32::FormatMessage(Win32::GetLastError() );
        }

        Ich muß gestehen, dass ich das überhaupt noch nicht verstehe. Auch aus dem, was ich bei CPAN über Win32::Process gelesen habe werde ich nicht schlau.
        Kannst du mit vielleicht erklären, wie das funktioniert und wie man es "einbaut" ? Das einfache einkopieren in den Anfang des Script funktioniert auf jeden Fall nicht (und ist mangels bergreifen der Funktion auch nicht unbedingt mein Ziel).

        Vile GRüße

        Rol

        1. Halihallo Rol

          Win32::Process::Create($Win32::Process::Create::ProcessObj,
          'c:\perl\bin\perl.exe',
          'perl '.join(' ', @ARGV),
          0,
          DETACHED_PROCESS,
          ".") or
          die print_error();

          Ich muß gestehen, dass ich das überhaupt noch nicht verstehe. Auch aus dem, was ich bei CPAN über Win32::Process gelesen habe werde ich nicht schlau.

          Was verstehst du denn nicht? - Win32::Prozess stellt eine Schnittstelle zur WinAPI her. Du kannst neue Prozesse erstellen über Win32::Process::Create. Eine Prozesseigenschaft ist DETACHED_PROCESS, d. h. dass dieser völlig unabhängig und in der Taskleiste nicht sichtbar ist. Das erste Argument ist ein Objektcontainer, der die Infos speichert, gefolgt vom zu startenden Programm, dann die Argumente, ...

          Ich habe hier @ARGV genommen (also, das was du in der DOS-Box nach dem Dateinamen stehen hast, die Programmparameter). D. h. du kannst das script, was oben steht, wie folgt verwenden (bei mir läuft es übrigens ganz prima):

          perl start_detaches_process.pl script_to_run.pl

          mit dem Code kannst du jedes Perl-Script als Detached Process laufen lassen. @ARGV enthält dann den Dateinamen des zu startenden Perl-Scriptes, welches dann im neuen Prozess dem Perl-interpreter wieder übergeben wird, der es dann interpretiert und laufen lässt.

          Ist's jetzt etwas klarer geworden?

          Kannst du mit vielleicht erklären, wie das funktioniert und wie man es "einbaut" ? Das einfache einkopieren in den Anfang des Script funktioniert auf jeden Fall nicht (und ist mangels bergreifen der Funktion auch nicht unbedingt mein Ziel).

          Also, du musst statt @ARGV wohl eine Variable hinsetzen, sodass du es in deinem Progi dynamisch festlegen kannst, welches Script auch gestartet werden soll. Dann musst du c:\perl\bin\perl.exe auf deinen Perl-Interpreter zeigen lassen. Funktioniert's dann?

          Viele Grüsse

          Philipp

          1. Halihallo Philipp

            Was verstehst du denn nicht?

            Ehrlich gesagt fast alles.

            D. h. du kannst das script, was oben steht, wie folgt verwenden (bei mir läuft es übrigens ganz prima):

            perl start_detaches_process.pl script_to_run.pl

            Danach zeigt der Task-Manager ein 'Winampa' bzw. 'Winoldap'.
            Ich schätze das wird mein Script sein, man sieht's ja sonst nicht.
            Es tut jedoch offenbar nichts bzw. nicht was es soll und im 'sichbarem Modus' auch macht (eine Datei auslesen und, wenn sich diese geändert hat, mit LWP einen URL aufrufen).

            mit dem Code kannst du jedes Perl-Script als Detached Process laufen lassen. @ARGV enthält dann den Dateinamen des zu startenden Perl-Scriptes, welches dann im neuen Prozess dem Perl-interpreter wieder übergeben wird, der es dann interpretiert und laufen lässt.

            Also der von dir gepostete code ist ein eigenes Script, dass dann 'mein' Script aufruft und 'Detached' startet, richtig?

            Also, du musst statt @ARGV wohl eine Variable hinsetzen, sodass du es in deinem Progi dynamisch festlegen kannst, welches Script auch gestartet werden soll.

            Wenn ichs mit 'perl start_detaches_process.pl script_to_run.pl' starte, weiß es (start_detaches_process.pl) doch welches Script gestartet werden soll(script_to_run.pl). Oder hab ich wieder was falsch verstanden?

            Dann musst du c:\perl\bin\perl.exe auf deinen Perl-Interpreter zeigen lassen.

            Hab ich natürlich.

            Viele Grüsse

            Rol

            1. Halihallo Rol

              Was verstehst du denn nicht?
              Ehrlich gesagt fast alles.

              Na, das werden wir mit der Zeit schon biegen ;-)

              D. h. du kannst das script, was oben steht, wie folgt verwenden (bei mir läuft es übrigens ganz prima):

              perl start_detaches_process.pl script_to_run.pl
              Danach zeigt der Task-Manager ein 'Winampa' bzw. 'Winoldap'.
              Ich schätze das wird mein Script sein, man sieht's ja sonst nicht.

              Nene, das ist nicht das Perlprogramm. das heisst nämlich schlicht 'perl'.

              Es tut jedoch offenbar nichts bzw. nicht was es soll und im 'sichbarem Modus' auch macht (eine Datei auslesen und, wenn sich diese geändert hat, mit LWP einen URL aufrufen).

              Nun, der einfachheit halber, versuch folgendes Script und starte auch das Detached-Process-Programm vom Desktop (beide Dateien auf'm Desktop; oder halt wo anders, is ja wurscht):

              while (1) {
                 open( F, '>>./test.txt' );
                 print F scalar(localtime())."\n";
                 close F;
                 sleep(1);
              }
              close F;

              dann sollte dir, beim gelungenen Start, eine Textdatei auf'm Desktop erscheinen, wo jede Sekunde eingetragen wird... So kannst du ganz einfach überprüfen, ob's funktioniert (einfach nach jedem Start, wenn du's nimmer brauchst, den Prozess killen).

              mit dem Code kannst du jedes Perl-Script als Detached Process laufen lassen. @ARGV enthält dann den Dateinamen des zu startenden Perl-Scriptes, welches dann im neuen Prozess dem Perl-interpreter wieder übergeben wird, der es dann interpretiert und laufen lässt.

              Also der von dir gepostete code ist ein eigenes Script, dass dann 'mein' Script aufruft und 'Detached' startet, richtig?

              Ja, aber sag doch einfach, wie du es willst, dann helfe ich es dir so abzuändern... Beschreib doch mal, was du machen willst.

              Also, du musst statt @ARGV wohl eine Variable hinsetzen, sodass du es in deinem Progi dynamisch festlegen kannst, welches Script auch gestartet werden soll.

              Wenn ichs mit 'perl start_detaches_process.pl script_to_run.pl' starte, weiß es (start_detaches_process.pl) doch welches Script gestartet werden soll(script_to_run.pl). Oder hab ich wieder was falsch verstanden?

              Ne, völlig richtig.

              Viele Grüsse

              Philipp

              1. Halihallo Philipp

                Was verstehst du denn nicht?
                Ehrlich gesagt fast alles.
                Na, das werden wir mit der Zeit schon biegen ;-)

                Habt Dank für Euere Geduld, Meister.

                Also kreisen wir das Problem ein:

                Ich habe zwei Schripten (ist das die Mehrzahl?)

                #######start_detaches_process.pl#######
                #!D:\Perl\bin\Perl.exe
                use Win32;
                use Win32::Process;
                print "Content-type: text/html\n\n";

                Win32::Process::Create($Win32::Process::Create::ProcessObj,
                 'd:\Perl\bin\Perl.exe',
                 'perl '.join(' ', @ARGV),
                 0,
                 DETACHED_PROCESS,
                 ".") or
                die print_error();

                sub print_error
                {
                   return Win32::FormatMessage(Win32::GetLastError() );
                }
                #######################################
                und

                ##########detache_process.pl###########
                #!D:\Perl\bin\Perl.exe
                while (1) {
                   open( F, '>>./test.txt' );
                   print F scalar(localtime())."\n";
                   close F;
                   sleep(1);
                }
                close F;
                #######################################
                Wenn ich 'detache_process.pl' vom Explorer aus starte, schreibt es wie zu erwarten jede Sekunde in die 'test.txt'.

                Starte ich es aus dem DOS Fenster mit:
                perl start_detaches_process.pl detacheTest.pl'
                blitzt kurz ein schwarzes DOS-Fenster auf und das war's. Keine Erzeugung/Aktualisierung der 'test.txt'.

                Auch wenn ich mich jetzt evtl. total zum Affe mache:

                Eigentlich dachte ich, dass das Modul Win32 bei Activestate Perl Standardmäßig dabei ist. Ich habe jetzt mal ppm gestartet und bei install Win32' bekomme ich 'could not locate PPD file for package Win32' :-(.
                Liegt der Hund schon hier begraben?

                Viele Grüsse

                Rol

                1. Halihallo Philipp

                  Es funktioniert!
                  Der Fehler lag vermutlich woanders:
                  Ich hatte das Script über eine Verknüpfung auf dem Desktop
                  (D:\Perl\bin\Perl.exe start_detaches_process.pl meinScript.pl) starten wollen.

                  Jetzt habe ich in @ARG 'meinScript.pl' reingeschrieben (direkt im Source von start_detaches_process.pl) und einfach eine Verknüpfung mit 'start_detaches_process.pl' erstellt.

                  Vielen Dank und viele Grüsse

                  Rol

                  1. Halihallo Rol

                    Es funktioniert!

                    Gratulation!

                    Der Fehler lag vermutlich woanders:
                    Ich hatte das Script über eine Verknüpfung auf dem Desktop
                    (D:\Perl\bin\Perl.exe start_detaches_process.pl meinScript.pl) starten wollen.

                    Wenn du in der Verknüpfung noch der richtige Arbeitsverzeichnispfad drinne stehen hättest, tät es auch so funktionieren.

                    Jetzt habe ich in @ARG 'meinScript.pl' reingeschrieben (direkt im Source von start_detaches_process.pl) und einfach eine Verknüpfung mit 'start_detaches_process.pl' erstellt.

                    @ARGV, nicht @ARG... Musst einfach schaun, dass die Vars überall stimmen.

                    Viele Grüsse

                    Philipp

                2. Halihallo Rol

                  Ich habe zwei Schripten (ist das die Mehrzahl?)

                  Ich tät schlicht die englische Mehrzahl nehmen: Scripts :-)

                  Starte ich es aus dem DOS Fenster mit:
                  perl start_detaches_process.pl detacheTest.pl'
                  blitzt kurz ein schwarzes DOS-Fenster auf und das war's. Keine Erzeugung/Aktualisierung der 'test.txt'.

                  Was??? - Ist mir schleierhaft... Hast du es auch im richtigen Verzeichnis aufgemacht?...

                  Auch wenn ich mich jetzt evtl. total zum Affe mache:

                  Eigentlich dachte ich, dass das Modul Win32 bei Activestate Perl Standardmäßig dabei ist. Ich habe jetzt mal ppm gestartet und bei install Win32' bekomme ich 'could not locate PPD file for package Win32' :-(.
                  Liegt der Hund schon hier begraben?

                  Ne, ne, Win32 und alle API's dafür (eg. sogar für WinRegistry, etc) sind bei Activestate bereits dabei. Damit hängts wohl kaum zusammen...

                  Viele Grüsse

                  Philipp

    2. Hi Philipp,

      Schau dir hierzu mal die Win32 Module an.

      Werde ich tun, danke. Wenn ich nicht klar komme, werd' ich noch mal posten. Vielleicht kanst du später noch mal ein Auge auf den Thread werfen

      Vielleicht finde ich irgendwo noch ein Beispiel...

      Wäre super :-).

      Viele Grüsse

      Rol

      1. Halihallo Rol

        Schau dir hierzu mal die Win32 Module an.

        Werde ich tun, danke. Wenn ich nicht klar komme, werd' ich noch mal posten. Vielleicht kanst du später noch mal ein Auge auf den Thread werfen

        Dazu brauchst du mich nicht aufzufordern, man sollte mich besser kennen :-)

        Vielleicht finde ich irgendwo noch ein Beispiel...
        Wäre super :-).

        already done ;-)

        Viele Grüsse

        Philipp

        1. Hi du guter Geist,

          Dazu brauchst du mich nicht aufzufordern, man sollte mich besser kennen :-)

          Sorry.

          already done ;-)

          Super. Danke. Kanns leider erst heute Mittag probieren, habe aber nicht die geringsten Zweifel an dir ;-).

          Viele Grüsse

          Rol

          1. Halihallo Rol

            Hi du guter Geist,

            ich bevorzuge Kohlenstoffeinheit 0x015 :-))

            Dazu brauchst du mich nicht aufzufordern, man sollte mich besser kennen :-)
            Sorry.

            War nicht als Kritik gemeint. Fakt ist aber, dass ich zumindest (und da werd ich nicht der einzige sein) die Threads immer weidermal lese, wo ich auch was geschrieben habe.

            already done ;-)

            Super. Danke. Kanns leider erst heute Mittag probieren, habe aber nicht die geringsten Zweifel an dir ;-).

            *räusper*... Ich hoffe es, sonst ist mein Ruf kaputti... Danke ;)
            Ich werd's besser mal probieren, dass ich noch ne Chance habe meine Ehre zu retten ;-)

            Viele Grüsse

            Philipp