Script unter WinXP im Hintergrund laufen lassen
Rol
- perl
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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