Perl - script kimenet naplózása

Van egy perl szkriptem amely fogad jó néhány paramétert.
Az egész szkript kimenetét szeretném egy fájlba naplózni majd emailben elküldeni.

Bash formában valahogy így nézne ki: perl szkript.pl para1 para2 parax | tee logfile | mail

Viszont ezt az egészet szeretném automatizálni, lehetőleg úgy, hogy ne egy másik fájlból hívjam meg az említett szkriptet.

Tehát a kérdésem az lenne, hogy valamilyen formában megoldható-e perlben, hogy az egész szkript kimenetét kiköpje egy fájlba "is" ne csak az STDOUT-ra. A mailer rész most nem játszik.

Hozzászólások

Nem ez kell?


open(SAVEOUT, ">&STDOUT");
open(STDOUT, ">foo.out") || die "Can't redirect stdout";
select(STDOUT); $| = 1;	
...
close(STDOUT);
open(STDOUT, ">&SAVEOUT");

Csaba

Egy kicsit tudnál segíteni?
Ha csak simán ezt csinálom:

open(STDOUT, ">logfile.out") || die "Can't redirect stdout";
print "teszt\n";
close(STDOUT);

Akkor a logfile.out-ba szépen bekerül az STDOUT, viszont szeretném az STDOUT kimenetét a képernyőn is látni. Sejtem, hogy amit írtál pont ezt teszi lehetővé, de annyira nem vágom.

--
\\-- blog --//

Nem, amit én írtam, az ezt nem tudja. Az azt csinálja, hogy először elmenti az eredeti STDOUT címét, aztán megnyitja a fájlt mint STDOUT, aztán írsz bele, aztán becsukja az STDOUTot mint fájlt, aztán megnyitja az elmentett címet mint STDOUT.

Arra, amit te szeretnél, (hogy a print kimenete menjen ki egy fájlba is meg a STDOUT-ra is) ez kell neked:

use Local::TeeOutput;
openTee (*STDOUT, *STDOUT, ">logfile.txt");
print "hello world\n";
closeTee(*STDOUT);

A modult letöltöd, és berakod pl. az /usr/local/lib megfelelő alkönyvtárába. Létre kell hozni ott egy Local nevű al-alkönyvtárat, ami benne van a perl PATH-jában. Teszteltem, működik.

De csak még egy hint:

Én nem szenvednék ezzel ennyit. Tedd át a STDOUT-ot egy fájlba, úgy ahogy föntebb írtad, aztán tail -f -el tudod követni a logfájlt. Előnye, hogy bármikor abbahagyhatod a követést (Ctrl-C) és bármikor folytathatod. Szerintem ez sokkal kézenfekvőbb megoldás, mint a fenti bűvészkedés.

Csaba

Az a helyzet, hogy ez a script nem egy szolgáltatásként futó dolog, hanem többször hívják meg, és jó lenne ha a meghívó ember a képernyőn látná, hogy mi történik + keletkezne az egészről egy logfile amit majd a későbbiekben el tudok küldeni emailben.

Az általad adott modul jónak tűnik a célra, csak sajnos third-party és szerverre nem szívesen raknék fel ilyet. Ha van disztró csomagban hasonló, inkább azt használnám. Sima tee csomag van azt látom. Meglesem.

A hint alapján lehet kicsit átgondolom mi legyen a menet :)

Mindenesetre köszönöm a segítséget!

--
\\-- blog --//

Hát, nem muszáj telepíteni a modult, elég, ha bemásolod a script végére, és kikommentezed belőle a sub openTee előtti sorokat, amik definiálják a csomagot. Kipróbáltam, így is megy, sima subrutin definícióként. Persze ez nagyon gányos megoldás, de járható. Viszont ekkor nem kell semmit telepíteni extrába, mégis használhatod az openTee és closeTee meghívásokat. És mivel a modul pure perl, végig is nézheted, nem csinál semmi furmányosságot.
Csaba

Hirtelen otlet: inditasz egy kulon threadet, azt pipe-al hozzakotod a fo thread STDOUT-jara, es ez a thread logol fileba is, meg ir a sajat STDOUT-jara is.

Kb ennyi.

Masik otlet a tie hasznalata lehet, amikor is csinalsz egy package-t ami implementalja a megfelelo dolgokat (man perltie, keress ra FileHandle-ra), es ehhez a packagehez tieolod a script stdoutjat.

Edit: hu, dejol tulbonyolitottam :P