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.
- 1153 megtekintés
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");
- A hozzászóláshoz be kell jelentkezni
ebben a másodpercben találtam hasonlót gugliban :)
szerintem ez kell nekem! thx! :)
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
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 --//
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 --//
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Huh ez az openTee önmagában hosszabb mint a scriptem :D
Viszont alternatív megoldásként találtam ilyet :)
open (STDOUT, "| tee -ai log.txt");
print "blah blah"
close (STDOUT);
Ez végre azt csinálja amit akarok :)
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
http://perldoc.perl.org/functions/open.html
Nem próbáltam:
open STDOUT, '|tee logfile';
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni