Schrift
[thread]7122[/thread]

Ausgabe umleiten will nicht

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Echelon1010000
 2005-07-11 14:14
#56256 #56256
User since
2005-06-29
18 Artikel
BenutzerIn
[default_avatar]
Hi

Ich verwende den Code
Code: (dl )
1
2
3
4
5
    open STDIN, '/dev/null' || die "Can't open /dev/null: $!";
   open (OUT,">>$logfile") || die "Can't open logfile $logfile: $!";
   open (ERR,">>$errlogfile") || die "Can't open logfile $errlogfile: $!";
   *STDOUT = *OUT; #redirect STDOUT
   *STDERR = *ERR; #redirect STDERR


Um die Ausgabe eines Programms in eine Logfile umzuleiten nachdem sich das Programm von der Konsole abgekoppelt hat und im Hintergrund sitzt.

Ich bekomme jedoch keine Ausgabe in der Datei. Auf der Konsole allerdings auch nicht. Die Ausgabe erfolgt durch normale "print" Anweisungen.

Wer kann mir sagen wo mein Denkfehler ist?

Gruss, Echelon
Relais
 2005-07-11 14:21
#56257 #56257
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Woher hast du denn solche Ideen? Ich möchte ja nicht ausschließen, daß das irgendwie gehen könnte, aber sowas habe ich nocht nicht gesehen.

Folgendes aus meiner Erinnerung der Manpages, ist also gerade mal ungetestet, aber so soll das gehen
Code: (dl )
1
2
3
4
5
6
close STDOUT;
close STDERR;
open (STDOUT,">>$logfile")
or die "Can't open logfile $logfile: $!";
open (STDERR,">>$errlogfile")
or die "Can't open logfile $errlogfile: $!";

Probier mal.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
J-jayz-Z
 2005-07-11 14:27
#56258 #56258
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das war so, hier ein kleines Script, als beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas für guten Stil einbinden

open(STDOUTFAKE, ">&STDOUT");
open(STDOUT, ">stdout.txt") || die "Kann stdout.txt nicht öffnen!";
#STDOUT nach stdout.txt leiten und STDOUTFAKE an die Konsole

print "STDOUT ist nun nicht mehr die Konsole...\n";
print STDOUTFAKE "Das kommt nun auf die Konsole...\n";

#STDOUT wieder herstellen
open(STDOUT, ">&STDOUTFAKE");
print "Nun ist STDOUT wieder auf der Konsole...\n";
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Echelon1010000
 2005-07-11 14:30
#56259 #56259
User since
2005-06-29
18 Artikel
BenutzerIn
[default_avatar]
Hi

Also, "solche Ideen" hab ich irgendwann man aus einem Tutorial übernommen das sich mit Serverdiensten in Perl befasste. Nun, ich schreibe keinen Server aber einen daemon, also hab ich es übernommen und angepasst. Damals funkionierte es auch. Heute nicht mehr. Ich finde das Tutorial nicht mehr und google hat mir auch nicht weitergeholfen. Hab mich da wohl auf meine Version zu sehr festgefahren.

Mit deiner Version funktioniert es, Danke :)

Gruss, Echelon
betterworld
 2005-07-11 17:20
#56260 #56260
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Relais,11.07.2005, 12:21]
Code: (dl )
1
2
3
4
5
6
close STDOUT;
close STDERR;
open (STDOUT,">>$logfile")
or die "Can't open logfile $logfile: $!";
open (STDERR,">>$errlogfile")
or die "Can't open logfile $errlogfile: $!";

Probier mal.[/quote]
Hmm, da muss man aber aufpassen. Falls man nicht $SIG{_ _DIE_ _} irgendwie manipuliert oder einen eval-Block benutzt, werden ja bei "die" die Fehlermeldungen nach STDERR ausgegeben. Aber das ist ja geschlossen. Eigentlich muss man auch gar nicht STDOUT und STDERR explizit schliessen, denn das geschiet automatisch, wenn man sie neu oeffnet.

[quote=Echelon1010000,11.07.2005, 12:14]
Code: (dl )
    open STDIN, '/dev/null' || die "Can't open /dev/null: $!";
[/quote]
Da ist die Operatorenreihenfolge falsch. Entweder ersetze "||" durch "or" oder benutze Klammern fuer open.\n\n

<!--EDIT|betterworld|1121088081-->
Echelon1010000
 2005-07-11 17:25
#56261 #56261
User since
2005-06-29
18 Artikel
BenutzerIn
[default_avatar]
Hi

Danke, hab ich nach dem obigen Beispiel schon gemacht.
Du sagst man muss aufpassen wenn man die STDOUT und STDERR zu macht weil die dann umgeleitet wird. Genau das will ich doch, ich will ja die Ausgabe in meiner logfile. Oder meinst du die Zeit zwischen dem Schliessen und neu aufmachen?

Ist das kritisch? Wenn ja muesste man die entsprechenden Zeilen herausnehmen und nur die "open" Anweisungen stehen lassen oder?

Gruss, Dura
Relais
 2005-07-11 17:55
#56262 #56262
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=betterworld,11.07.2005, 15:20]Hmm, da muss man aber aufpassen. Falls man nicht $SIG{_ _DIE_ _} irgendwie manipuliert oder einen eval-Block benutzt, werden ja bei "die" die Fehlermeldungen nach STDERR ausgegeben. Aber das ist ja geschlossen.[/quote]
Oh, da hat wer aufgepaßt! ;-)
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
J-jayz-Z
 2005-07-11 18:27
#56263 #56263
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
STDERR ist nicht geschlossen. Es ist umgeleitet...
Dann erscheint die Ausgabe im Logfile und eben nicht auf der Konsole.
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-07-11 18:45
#56264 #56264
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Doch, erst wird STDERR geschlossen. Wenn jetzt z.B. $logfile nicht existiert, schlägt das open fehl und die wird ausgeführt. Aber STDERR ist immer noch geschlossen, weil open nicht erfolgreich war, STDERR ist also nicht umgeleitet!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
J-jayz-Z
 2005-07-11 18:48
#56265 #56265
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
okay, stimmt. Ihr seid von seinem code ausgegangen, nicht von meinem... :blush:
Mein Fehler. Sry...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-07-11 14:14.