Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8912[/thread]

Perl-Skript und Scheduled Tasks: Perl-Skript läuft nicht los...



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Ozymades
 2007-04-10 14:25
#75778 #75778
User since
2007-04-10
8 Artikel
BenutzerIn
[default_avatar]
Hi Leute,

Ich brauchte ein Skript, das sollte alle Dateien älter als x Tage löschen. Habe ich geschrieben, kein Problem
(Ok, es gibt Probleme mit Dateiberechtigungen, aber um die soll es hier nicht gehen...).
Das Skript schreibt ein Logfile mit folgender Funktion:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub print_log
{
my $string = shift;
my $logfile = "PATH\FILENAME";
$! = 0;
unless(open(LOG, ">>", $logfile))
{
print "Konnte Logfile nicht oeffnen: $!\n";
exit 1;
}
print $string;
print LOG $string;
close(LOG);
}


Auf der Konsole läuft das auch prima, das Logfile wird erzeugt, das Skript schreibt auch rein, alles wunderbar.
Jetzt soll dieses Skript aber unter Windoof als Scheduled Task laufen.

Und jetzt tut es nicht mehr. Es legt auch das Logfile nicht mehr an...

Was muss man denn beachten, wenn man ein Perl-Skript schreiben will, dass als Scheduled Task laufen soll?
Das Skript läuft auch dann nicht, wenn ich die prints rausnehme.

Gruss,
Ozymades
renee
 2007-04-10 14:37
#75779 #75779
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bekommst Du irgendwelche Fehlermeldungen? Wie hast Du das mit dem Scheduled Task gemacht?

Hast Du mal nach dem Dateinamen des Logfiles gesucht, nicht, dass das Logfile in einem ganz anderen Ordner angelegt wurde (ich weiß ja nicht, ob Du den Pfad relativ oder absolut angegeben hast).
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/
GwenDragon
 2007-04-10 14:39
#75780 #75780
User since
2005-01-17
14548 Artikel
Admin1
[Homepage]
user image
1) Gibts du den ganzen Pfad an?
2) Verwende mal einen Pfad ohne Backslash, anstatt \ also /, das klappt auch
3) Du brauchst für das Verzeichnis, in dem das Logfile gespeichert wird auch Schreibrechte.
4) Mit welchen Userrechten (Admin, Hauptbenutzer, Benutzer) läuft das Skript?

Quote
Code: (dl )
my $logfile = "PATH\FILENAME";
ist als Pfad falsch.
Es muss schon in ' ' gesetzt sein oder "PATH\\FILENAME" sein.\n\n

<!--EDIT|GwenDragon|1176201710-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

MisterL
 2007-04-10 15:10
#75781 #75781
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Da scheint es wohl noch mehr Fehler zu geben:
-existiert der Pfad überhaupt ?
-darf der jeweilige Nutzer in diesem schreiben ?
(okay, die waren schon...)
-Version des Perl Compilers ?

Den Befehl "C:\perl\bin\perl <kompletter>\<pfad>\<zur>\<Datei>\beispiel_log_skript.pl" kann man jedenfalls in eine Batchdatei auslagern und diese über den Schedule Manager aufrufen.
Und ein bisschen mehr Code könnte wie so häufig nicht schaden ;-)
“Perl is the only language that looks the same before and after RSA encryption.”
Ozymades
 2007-04-10 15:32
#75782 #75782
User since
2007-04-10
8 Artikel
BenutzerIn
[default_avatar]
Hmm, ok. Also hier mal ein komplettes Beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!perl -w
use strict;
use subs qw/print_log/;

my $var = "Hallo Welt!\n";
print_log $var;

sub print_log
{
my $string = shift;
my $logfile = "c:\\temp\\test.log";
$! = 0;
unless(open(LOG, ">>", $logfile))
{
print "Konnte Logfile nicht oeffnen: $!";
exit 1;
}
print $string;
print LOG $string;
close(LOG);
}


Das funktioniert auch prima in der Konsole, das Logfile wird angelegt und nachher steht "Hallo Welt!\n" drin.
Aber wenn ich das Skript als gleicher User als Scheduled Task laufen lasse geht es nicht mehr.

Angelegt wurde der Task wie folgt:
Control Panel -> Scheduled Tasks -> Add Scheduled Task

Der User hat alle Rechte auf das Verzeichnis.

Ich bekomme keine Fehlermeldungen.

Und das sagt Perl -v:

This is perl, v5.6.0 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2000, Larry Wall

Binary build 623 provided by ActiveState Tool Corp. http://www.ActiveState.com
Built 16:27:07 Dec 15 2000


So, hoffe das sind jetzt genug Informationen.

Gruss,
Ozymades
bloonix
 2007-04-10 15:36
#75783 #75783
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ozymades,10.04.2007, 12:25]
Code: (dl )
$! = 0;
[/quote]
Welchen Sinn könnte die Zuweisung haben?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-04-10 15:41
#75784 #75784
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
was läuft denn nicht? Wird das Logfile nicht erstellt oder funktioniert nur
die Ausgabe nicht? Bitte änder doch mal die Zeile

print LOG $string;

nach

print LOG $string or die $!;
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Ozymades
 2007-04-10 15:46
#75785 #75785
User since
2007-04-10
8 Artikel
BenutzerIn
[default_avatar]
[quote=opi,10.04.2007, 13:36][quote=Ozymades,10.04.2007, 12:25]
Code: (dl )
$! = 0;
[/quote]
Welchen Sinn könnte die Zuweisung haben?[/quote]

Das hat nur dann Sinn, wenn man in einem längeneren Skript ist und zwischen verschiedenen Aufrufen $! abprüft.
Das wird aber nicht zurückgesetzt, sprich, wenn weiter vorne was schiefgegangen ist, steht die Fehlermeldung immer noch in $!, obwohl der letzte Befehl funktioniert hat.
Das ist eine Sache der Gewohnheit beim mir...
bloonix
 2007-04-10 15:56
#75786 #75786
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ozymades,10.04.2007, 13:46]Das wird aber nicht zurückgesetzt, sprich, wenn weiter vorne was schiefgegangen ist, steht die Fehlermeldung immer noch in $![/quote]
aber das ist doch garnicht schlimm, denn egal was du ausführtst, ob
open(), close(), print() ... in $! steht immer der aktuelle Fehler. Wenn also
eine Funktion FALSE zurückliefert und du mit einem "if", "unless", einem
"or" oder was auch immer reagierst, dann brauchst du $! nie auf 0 setzen.

Das halte ich für unnötigen Code. Wie sieht denn das aus...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$! = 0;
print LOG "foo bar";
if ($!) {
print STDERR "Fehler: $!";
}
$! = 0;
print LOG "foo bar";
if ($!) {
print STDERR "Fehler: $!";
}
$! = 0;
print LOG "foo bar";
if ($!) {
print STDERR "Fehler: $!";
}
$! = 0;
print LOG "foo bar";
if ($!) {
print STDERR "Fehler: $!";
}


Das macht deinen Code schwammig. Warum nicht so:

Code: (dl )
1
2
3
4
print LOG "foo bar" or warn "Fehler: $!";
print LOG "foo bar" or warn "Fehler: $!";
print LOG "foo bar" or warn "Fehler: $!";
print LOG "foo bar" or warn "Fehler: $!";


:)\n\n

<!--EDIT|opi|1176206418-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Ozymades
 2007-04-10 16:07
#75787 #75787
User since
2007-04-10
8 Artikel
BenutzerIn
[default_avatar]
Das mache ich ja auch nicht bei jedem Befehl, sondern nur bei open.
Ich bin deswegen mal in einen blöden Fehler gelaufen.
Da habe ich mit
Code: (dl )
if($!){}
noch ziemlich umfangreiche Reparatur- und Aufräumarbeiten abgefahren und hatte aber vorher eine unwichtige Operation gemacht, die mir aber $! gesetzt hat. Und dann bin ich immer rausgeflogen und habe mich gewundert warum...\n\n

<!--EDIT|Ozymades|1176206950-->
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-04-10 14:25.