2013-09-02 17 views
5

Próbuję zaimplementować w moim skrypcie opcję -s (tj. Cicha) - po podaniu Błędy/Informacje itp. Zostaną one wysłane do syslog, w przeciwnym razie drukowanie na ekranie, a także wysłać do syslog w tym samym czasie. To, co robię:Drukowanie wiadomości na ekranie, a także wysyłanie do sysloga w tym samym czasie

echo -e "This Is a Test Message\nWell, not really!!" 2>&1 | logger 

aby wysłać wiadomość do syslogecho (które nie drukuje na ekranie), ale może nie tylko dowiedzieć się, jak to zrobić zarówno w tym samym czasie. Widzę, że ludzie mówią tylko o zalogowaniu się pod numerem syslog lub wysyłaniu dziennika do pliku o innym numerze podczas drukowania na ekranie, ale nie o sytuacji, którą próbuję rozwiązać. Każda pomoc lub wskaźnik będą bardzo mile widziane. Twoje zdrowie!!

+0

możesz podłączyć do 'tee':' ... | tee -a/var/log/syslog' – hek2mgl

+2

Nie używaj 'tee -a/var/log/syslog' - tylko root może to zrobić, a syslogd może wykonywać wszystkie rodzaje alternatywnych operacji poza dołączaniem do tego pliku. –

+0

@ hek2mgl: Prawda, ale ten plik różni się w zależności od systemu; na przykład '/ var/log/messages' dla systemu opartego na systemie Red Hat. Użycie 'logger' jest bezpieczniejszym IMO. Twoje zdrowie!! – MacUsers

Odpowiedz

4

Jeśli chcesz wysłać wiadomość do syslog i na standardowe wyjście (nie stderr), można to zrobić za:

echo -e "This Is a Test Message\nWell, not really!!" | tee >(exec logger) 

a skuteczny sposób to zrobić (jeśli tworzysz funkcję) :

exec 40> >(exec logger) 

function log { 
    echo -e "$1" 
    echo -e "$1" >&40 
} 

log "something..." 

exec 40>&- ## optionally close it at the end of the script. 

Który uratowałby twój skrypt od wywołania zewnętrznego rejestratora binarnego za każdym razem, gdy wykonasz echo.

+0

Jak wywołuje się funkcję? – Juto

+0

@konsolebox: Myślę, że to jest sposób, aby przejść do mnie.Więc, po prostu mack na pewno, jeśli używam niestandardowego deskryptora pliku, nie ma sposobu, aby to zrobić inne niż "echo" dwa razy? Cheers! – MacUsers

+0

@ juto : Wywołujesz funkcję w taki sam sposób, jak zrobił to konsolebox: 'log" Wydrukuj coś ... "'. * Log * to nazwa funkcji – MacUsers

0

można zrobić:

echo -e "This Is a Test Message\nWell, not really!!" | logger -s 

Instrukcja strona (mężczyzna logger) stwierdza:

-s  Log the message to standard error, as well as the system log. 
+0

Próbowałem już '-s', ale nie podoba mi się, że poprzedza ono wiadomość nazwą użytkownika:' admin: This Is a Test ... "' .Nie radzi sobie także z '\ n' dla nowej linii, co nie jest dla mnie dobre: ​​Pozdrawiam! – MacUsers

+0

Usunąłem 2> i 1, ponieważ jest to w zasadzie zbędne - nie oczekuje się tutaj żadnego efektu, niezależnie od tego, czy użyto opcji -s czy nie, –

1

W takim przypadku, po prostu echo tej samej wiadomości dwukrotnie. Można to zrobić:

echo -e "This Is a Test Message\nWell, not really!!" | tee /dev/stderr | logger 

Ale to faktycznie prostsze i bardziej efektywne robić:

error='This Is a Test Message\nWell, not really!!' 
echo -e "$error" >&2 
echo -e "$error" | logger 

> & 2 wysyła wyjście stderr, niż standardowe wyjście.