Schrift
[thread]6856[/thread]

win32::process: alles in log datei schreiben (Seite 2)

Leser: 3


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
GwenDragon
 2005-04-06 20:07
#53393 #53393
User since
2005-01-17
14601 Artikel
Admin1
[Homepage]
user image
Wie wäre es mit IPC::Cmd, IPC::Run, IPC:::Run3 oder andere IPC::* zur Interprozesskommunikation?
Habe ich aber noch nicht verwendet :shy:\n\n

<!--EDIT|GwenDragon|1112803836-->
sesth
 2005-04-07 10:46
#53394 #53394
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hab ich auch noch nicht verwendet, aber ich sehe nicht, wie das Handle im Subprozess dupliziert werden kann.
Gruß
Thomas
Rambo
 2005-04-07 13:01
#53395 #53395
User since
2003-08-14
803 Artikel
BenutzerIn

user image
[quote=sesth,06.04.2005, 17:07]Ich vermute, dass IO::Tee nur im Perl-Skript wirkt. Der Sub-Prozess schreibt ja nun mal auf stdout und weiß nichts vom duplizierten Handle im Skript. Die tee.exe kann man folgendermaßen einsetzen (wenn ich das noch richtig zusammenbekomme):
Code: (dl )
java .... | tee logfile.log

Damit wird das Handle dann im Sub-Prozess dupliziert und in Perl muss man gar nichts machen.[/quote]
meinst du so?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use Win32::Process;
use Win32;

#close STDOUT;
#open STDOUT, ">>test.txt";

sub ErrorReport
{
print Win32::FormatMessage( Win32::GetLastError() );
}
my $ProcessObj = "";
print STDOUT Win32::Process::Create($ProcessObj,
"D:\\WIN32APP\\JRE_142_03\\bin\\java.exe",
"java.exe -version | tee logfile.log",
1,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();

$ProcessObj->Suspend();
$ProcessObj->Resume();
$ProcessObj->Wait(INFINITE);


#close STDOUT;

wenn ich tee über die console benuzte kann man das
so machen tee >test.log
aber im perl hab ich das noch nicht hinbekommen

es wäre mir zwar lieber alles in perl zu machen da ich
kein externes tool bis her verwendet habe in diesem script
aber notfalls benutze ich dies.
ich wollte auch als zweiten teil eine max grösse für ein
log file anlegen aber das kann ich extern dann natürlich auch
nicht!
seltsam das es da in perl nix geben soll.

danke erst mal
fürti rambo
Rambo
 2005-04-27 16:32
#53396 #53396
User since
2003-08-14
803 Artikel
BenutzerIn

user image
[quote=esskar,06.04.2005, 16:25]man kann die pipes umleiten und dann wieder auf die console (console != stdout) rausschreiben... hab das in c++ gemacht, versuch es nachher nach Perl zu übersetzen![/quote]
hast du das evtl. schon probieren können? hab bis jetzt
noch nichts hinbekommen um logfiles mit zu schreiben :-(

merci
rambo
Rambo
 2005-05-06 19:38
#53397 #53397
User since
2003-08-14
803 Artikel
BenutzerIn

user image
sorry muss leider noch mal nervern :-(
ich abe jetzt beim stöbern etwas gefunden und versucht es
einzubinden
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use strict;
use warnings;
use diagnostics;
use Win32::Process;
use Win32;

my $file= "capture.txt";
my $command = Win32::Process::Create(my $ProcessObj,
                      "E:\\Win32app\\JAVA_VERSION\\JRE_142_03\\bin\\java.exe",
                      "java.exe -version",
                      3,
                      NORMAL_PRIORITY_CLASS,
                      ".")|| die ErrorReport();
                     
                      $ProcessObj->Suspend();
                      $ProcessObj->Resume();
                      $ProcessObj->Wait(INFINITE);

open ( FILE, ">$file") or die "Can't open $file, stopped";
open ( PIPE, "$command |") or die "Can't open pipe, stopped";

while (<PIPE>)
    {
     print;
     print FILE;
    }
close(FILE);
close(PIPE);

sub ErrorReport
  {
   print Win32::FormatMessage( Win32::GetLastError() );
  }

leider geht es hiermit immer noch nicht und er gibt eine meldung aus die ich nicht verstehen kann
java version "1.4.2_03"
Java™ 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot™ Client VM (build 1.4.2_03-b02, mixed mode)
Der Befehl "1" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

warum befehl 1 und was mach ich noch falsch?

könnte mir bitte jemand helfen?

merci

rambo
coax
 2005-05-06 21:04
#53398 #53398
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Rambo,06.05.2005, 17:38]Der Befehl "1" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

warum befehl 1 und was mach ich noch falsch?
[/quote]
Code: (dl )
1
2
3
4
5
my $command = Win32::Process::Create(my $ProcessObj,

# [ ... ]

open ( PIPE, "$command |") or die "Can't open pipe, stopped";

Win32::Process::Create liefert 1 oder 0 (wahr || falsch) zurueck und du versuchst dann 1 (bzw. 0) als Befehl aufzurufen, das funktioniert natuerlich so nicht.

Keine Ahnung wie du an die Ausgabe des Prozesses ueber die Win32::*-Methoden rankommst, aber ist's denn nicht moeglich beim Erzeugen des Prozesses die Ausgabe einfach in eine (vll. temporaere) Logdatei umleiten zu lassen (wie in der Konsole "C:\>befehl > my_logfile" )?\n\n

<!--EDIT|coax|1115399216-->
,,Das perlt aber heute wieder...'' -- Dittsche
coax
 2005-05-06 23:22
#53399 #53399
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Wuerde dir vielleicht das hier etwas weiterhelfen ?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl
$|++;
 use strict;
 use warnings;

 my $pid = fork;

 filter();

 unless($pid == 0) {
     print("$_\n") && sleep 1 for 1..10;
     exit(0);
 }

 sub filter {
     my $pid = open(STDOUT, '|-');
     return if $pid;
     die "Can't fork: $!"
         unless defined $pid;
     while(<STDIN>) {
         print ">> $_";
     }
     exit;
 }

Mit der obigen open-Anweisung forkt sich das Programm und piped die STDOUT auf die STDIN des Kindes, dass dann davon lesen kann.
,,Das perlt aber heute wieder...'' -- Dittsche
Rambo
 2005-05-07 18:21
#53400 #53400
User since
2003-08-14
803 Artikel
BenutzerIn

user image
danke @ coax werde mal schauen ob ich mit fork weiterkomme
bisher habe ich mich mit fork noch nicht auseinander gesetzt
da ich es noch nicht verstehe :-(

merci

rambo
Rambo
 2005-05-07 20:03
#53401 #53401
User since
2003-08-14
803 Artikel
BenutzerIn

user image
[quote=coax,06.05.2005, 19:04]Logdatei umleiten zu lassen (wie in der Konsole "C:\>befehl > my_logfile" )?[/quote]
hatte ich auch schon probiert aber ohne erfolg :-)

was bedeutet denn das '|-' nach dem STDOUT?\n\n

<!--EDIT|Rambo|1115482425-->
coax
 2005-05-08 02:53
#53402 #53402
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Rambo,07.05.2005, 18:03]was bedeutet denn das '|-' nach dem STDOUT?[/quote]
Wenn du "|-" an open als Pfadargument uebergibst wird ein Kindprozess erzeugt, der mit den geoeffneten Dateihandel (lesend) verbunden ist. open(STDOUT, "|-") erzeugt also ein Kind das ueber STDIN die Daten des STDOUT-Kanals des Vaters bekommt.

siehe dazu
perldoc perlipc (Abschnitt Safe Pipe Opens) und
perldoc -f open\n\n

<!--EDIT|coax|1115506584-->
,,Das perlt aber heute wieder...'' -- Dittsche
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2005-04-06 13:12.