Newsgroup: it.comp.os.linux.sys
Titolo: redirezione su syslog: idee cercasi (se esistono)

breve storia: ho 4 script che partono in crontab ed in pipe usano il 
comando "logger".
Il comando in crontab è qualcosa di questo tipo:
pippo.sh 2>&1 | logger -p qualche_facility -t BLABLA
 
 
Problema: logger può inviare a syslog non più di 1024 byte (ometto 
dettagli sulla questione).
Nel caso in cui logger dovesse inviare un solo byte in più, si fermerebbe 
ed uscirebbe.
L'uscita di logger, causerebbe a sua volta l'uscita dello script posto in 
pipe. Questo evento si è verificato due o tre volte in sei mesi, ma 
trattandosi di uno script vitale e importante, quelle due o tre volte in 
cui è successo, me le hanno fatte pesare, come se fossi il più stronzo di 
tutti i sistemisti di tutti i tempi: roba del tipo "aspetta che la Fornero 
toglie l'articolo 18 e poi ti faccio vedere io"... scherzo, ma la 
situazione, data l'importanza di questi script, è stata veramente 
incresciosa e grave.
 
Ho trovato un workaround:
- ho creato un fifo file: $HOME/miofifo
- ho lanciato uno script che gira perennemente, del tipo:
while true; do
  cat $HOME/miofifo | logger -p qualche_facility -t BLABLA 
done
- lo script in crontab è cambiato come segue:
pippo.sh >> $HOME/miofifo 2>&1
 
Questo fa si che ad ogni input sul fifo il comando cat manda l'output al 
syslog, esce e riparte. Al tempo stesso, nel caso in cui dovessi superare 
i 1024 byte, "cat" ripartirebbe ugualmente e, eventualmente, mi perderei 
un inserimento nel syslog, ma lo script continuerebbe a loggare gli 
inserimenti successivi. Perdere due o tre inserimenti ogni 6 mesi è del 
tutto fattibile.
 
VI PIACE QUESTA SOLUZIONE?
Voi come fareste?
Esscluse soluzioni che prevedono il tuning di syslog su Aix... non lo 
voglio fare, e comunque temo che il programma in pipe possa uscire anche 
per qualche altro stupido motivo.
 
-- 
echo onailimissaM | awk 'BEGIN { FS = "" }
{ for (i = NF; i >= 1; i-- )
  printf $i }'; echo

 Esscluse soluzioni che prevedono il tuning di syslog su Aix
 
Ok, syslog-ng o rsyslog sono fuori questione :)
 
Enrico

 pippo.sh 2>&1 | logger -p qualche_facility -t BLABLA
 
Una cosa più o meno come questa non andrebbe bene?
 
pippo.sh 2>&1 | while read -n 900 porzione; do logger -p qualche_facility -t BLABLA $porzione; done
 
Sulla falsariga di:
 
lem@biggy:~$ echo Questa è una prova provetta > file
lem@biggy:~$ cat file |& while read -n 6 porzione; do echo $porzione ; done 
Questa
è una
prova
prove
tta
 
Naturalmente  "2>&1 |"  e  "|&"  sono la stessa identica cosa,
ça va sans dire.
-- 
Bye, Lem
Ceterum censeo ISLAM esse delendum
_________________________________________________________________
Non sprecare i cicli idle della tua CPU, né quelli della tua GPU.
 
http://www.worldcommunitygrid.org/index.jsp
 
http://www.rnaworld.de/rnaworld/
 
http://home.edges-grid.eu/home/
 
 
http://www.gpugrid.net/
 


e lo so.... inizialmente, visto che si tratta di uno script che lavora sia 
su Aix, sia su Red Hat, avevo usato Red Hat come syslog server e questa 
cosa era abbastanza fattibile.
Purtoppo, non so per quale motivo, mi hanno obbligato ad utilizzare Aix 
come syslog, che loro considerano come "sistema centrale" o "elaboratore 
centrale" che dir si voglia.


 ça va sans dire.
 
 
caruccio questo sistema di spezzettare la riga a N byte... mi eviterebbe 
di creare il fifo file, e mi eviterebbe di controllare che lo script in 
loop che ho lanciato stia girando o meno.



Facebook: Massimo Bacilieri

 fermerebbe ed uscirebbe.
 
volevo aggiungere una cosa: questo è un prolema di Aix.
Ho provato adesso sul mio laptop con linux e syslog spezza automaticamente 
le righe :-(


 le righe
 
Infatti non riuscivo a riprodurre. Cercando nel gruppo ho visto la 
risposta che ti è stata data ad agosto ma quella suggeriva che il limite 
fosse lo MTU, invece da questa discussione sembra che il limite sia di 
programma.
 
Per curiosità che valore di ritorno ottieni con:
 
 
dd if=/dev/zero bs=1 count=1025 2>/dev/null | \
   tr '\0' '\101' | \
   logger -t FOO; echo $?


qmail include splogger, che funziona su AIX(*) & spezza le righe troppo 
lunghe:
char buf[800]; /* syslog truncates long lines (or crashes); GPACIC */
 
-- che caspio vuol dire "GPACIC"? Pare che non lo sappia nemmeno google!
 
 
 
(*) Mai provato, ma c'è scritto nel README

    tr '\0' '\101' | \ logger -t FOO; echo $?
 
non ho un Aix in casa ed è domenica... magari provo domani :)


 Quindi, i tre pezzi sommati devono dare 1024
 
Però non vuol dire che logger esca con errore se il messaggio supera i 
1024 byte. La mia è comunque solo una curiosità.

 Quindi, i tre pezzi sommati devono dare 1024
 
devono dare *al massimo* 1024



su Aix mi sa tanto di si...ti spiego... è abbastanza banale (anche se mi 
riservo di fare prove più esaustive domani).
vado in una directory con tanti file:
# cd /directory/con/tanti/file
# ll|logger
 
sul mio laptop non succede nulla e tutto viene loggato. Probabilmente 
logger (o è syslog che si autoprotegge??) si occupa di spezzare l'output.
Sull'Aix, invece viene emesso un messaggio di errore, che ti notifica che 
logger/syslog è andato in bomba e viene loggato solo fino al 1024esimo 
byte.


 centrale" che dir si voglia.
 
Spero che quella macchina faccia anche altro, perche` e` come usare un SUV 
per andare a fare la spesa dal pizzicagnolo di fronte casa, eh :)
 
Enrico

 che ti notifica che logger/syslog è andato in bomba
 
Macintosh prima onda?


questi i risultati dell'esecuzione dello script pippo.sh
Lo script contiene queste due righe:
ls -la /usr/bin
echo ciao
 
Lancio lo script mettendolo in pipe logger e questo è questo l'esito:
Could not send msg drwxr-xr-x    3 bin      bin             256 Sep 01 2007  X11r5
. Please retry
 
Controllo se per caso ha inserito "ciao" nel syslog....
... no, niente. Lo script è uscito insieme al comando logger.
 


infatti da noi hanno migrato quasi tutto su blade e Linux, riconoscendo il 
fatto che con i soldi di un powerpc ci compri almeno 10 blade ;-)
 
quella macchina comunque fa altro... e dovrebbe essere una partizione in 
un partizionabile e non una macchina fisica.


 
Esistono i Power Blade che sono dei blade su cui ci puoi mettere AIX. Per chi (come me) di solito lavora su macchine dal P770 in su è un delirio visto che per la configurazione dei device impazzisci nelle varie interfaccie del blade center, tuttavia pensavo andassero peggio..
 
A prescindere dalle singole feature di sistema operativo (che possono servire o non servire) posso dirti che con gli unix proprietari ho una migliore integrazione OS->Hardware. Cosa che purtroppo non posso dire di Linux su x86...
 
 
 

 
 
Puoi sicuramente scrivere uno script più robusto, che non perda nessun 
messaggio di log, usando Perl, Ruby o Python (a piacere quello che ti 
piace/conosci meglio).
 
 
Ciao  Manlio

 Linux su x86...
 
non ci vuole tanto: microkernel con 10 driver per le 10 periferiche fatte 
da IBM apposta per quell'OS.
Renditi conto che in quelle macchine anche il power-cord è IBM, quindi, o 
funziona, o funziona ;-)
Ma comunque, cosa intendi dire con "Linux su x86"?
Linux sul tuo portatile o Linux su un blade/rack certificato per Linux?



Ho già ereditato un programma Java ed ho fatto il porting (come qualcuno 
ha fatto notare c'erano i miei messaggi già ad agosto)
Pensa te: il precedente programma in Java, per inviare le mail di 
notifica, piuttosto che usare le apposite classi, usava come wrapper uno 
script shell, faceva delle find con dei comandi Unix e loggava tutto su 
file di testo.... non ho proprio voglia di fare un altro porting.


 non ho proprio voglia di fare un altro porting.
 
Piu` che altro un porting potrebbe essere inutile, in quanto e` syslog che 
non accetta un log piu` lungo di 1024 byte e non il comando logger. Di certo 
usando Perl o Python avresti a disposizione anche altri metodi di logging 
(tutti e due hanno librerie simili a log4j, per ribadire l'incompetenza dei 
programmatori Java che hanno lavorato li da te), ma questo non significa che 
tu possa usarli
 
Enrico
[1] l'unica fuori dal coro e` il find, che prima di Java 7 non era 
facilmente implementabile, ovvero Java 7 mette a disposizione delle classi 
specifiche (java.nio) per la scansione ricorsiva del file system

 testo.... non ho proprio voglia di fare un altro porting.
 
Io intendevo scrivere il filtro in Perl/Python/Ruby, non l'intero 
programma.
 
Certo lo puoi fare anche dalla semplice shell, come altri hanno fatto 
vedere.
 
 
 
Ciao  Manlio

 classi specifiche (java.nio) per la scansione ricorsiva del file system
 
beh questo non lo sapevo.... ma d'altra parte come facevo a saperlo, visto 
che capisco veramente poco di Java :) Fare il porting, capendo malissimo 
il codice, è stato un bagno di sangue. Non sapevo nemmeno che era 
possibile disassemblare il codice... una volta disassemblato, l'ho aperto 
e ho cominciato ad andare a tentoni e ad intuito :)
 
p.s.: comunque (come sostengo da tempo) la shell - CON TUTTI I SUOI TOOL 
ESTERNI - fornisce uno strumento di lavoro abbastanza versatile e potente 
e da quando sono arrivati gli array associativi sembra _quasi_ non temere 
nemmeno i linguaggi più blasonati.


 nemmeno i linguaggi più blasonati.
 
Beh, questo e` un altro discorso, di sicuro uno script bash e` decisamente 
piu` portabile di uno script python/perl/ruby o di un applicativo java :)
 
Enrico