Linux: jak przekierować stdout i stderr do programu rejestrującego?

22

Mam program, który muszę uruchomić podczas uruchamiania, ma wyjście na stdout i stderr, które chcę przekierować do dziennika systemu za pomocą polecenia logger. W skrypcie uruchamiania mam to:

/ home / nazwa_katalogu / nazwa_aplikacji -v | logger 2> i 1 &

To przekierowuje stdout do syslog, ale stderr nadchodzi do konsoli, więc muszę udoskonalić polecenie.

Fred Basset
źródło
Użytkownik >&: tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Boris Burkov

Odpowiedzi:

30

Musisz połączyć wyjście STDERR i STDOUT przed potokowaniem logger. Spróbuj zamiast tego:

/home/dirname/application_name -v 2>&1 | logger &

Przykład

$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+  Done                    echo "hi" 2>&1 | logger

$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi

Tutaj możesz również użyć skrótu, jeśli używasz go ostrożnie w rzeczywistej powłoce Bash (nie mylić z Dash):

$ echo "hi" |& logger &

UWAGA: Jest to równoważne z <cmd1> 2>&1 | <cmd2>. Ponownie użyj powyższego tylko podczas interaktywnego korzystania z rzeczywistej powłoki Bash, byłby to dobry sposób, aby do niej podejść.

fragment z ABSG

# | & został dodany do Bash 4 jako skrót od 2> & 1 |.

Referencje

slm
źródło
2
slm, bez obrazy, ale ta ostatnia forma to szerzenie się nadużyć bashism. Ilość problemów, które może powodować niepotrzebna stenografia, wcale nie jest warta tego, jak niewiele można by było zyskać na ich użyciu. Na przykład, nawet po prostu na własnym komputerze, jeśli umieścisz powyższe w skrypcie i dashspróbujesz wykonać skrypt podczas rozruchu tylko po to, aby zakończyć się niepowodzeniem i uruchomić proces rozruchu ... cóż ... Kiedy wspomniana jest taka składnia, powinna zawsze w kontekście interaktywnych muszli tylko , albo przynajmniej takie jest moje zdanie.
mikeserv
@mikeserv - bez obrazy 8-). Uwzględniam je, ponieważ są one w przewodniku ABSG. Zakładałem (być może niepoprawnie), że OP używa Bash, ponieważ pokazały, 2>&1ale twoje ostrzeżenia są dość mądre, biorąc pod uwagę, że przykład dotyczy start-upów. Sprawię, że te ostatnie wskazówki będą bardziej widoczne z ostrzeżeniem, że są przeznaczone tylko do interaktywnych pocisków Bash.
slm
@mikeserv - nie, to dobra rada. Zasadniczo nie używam Dasha ani nawet Ubuntu, więc jestem trochę nieświadomy tych problemów, ale wciąż są one bardzo realne i dobrze jest je wskazać, ponieważ Ubuntu / Debian / Dash jest prawdopodobnie najczęstszym scenariuszem.
slm
Szczerze mówiąc, nie używam też debianów, ale coraz bardziej zdaję sobie sprawę, że wielu z nich korzysta. Ja jednak używam dash- to naprawdę jest szybkie.
mikeserv
1
Cóż, może to nie być konieczne - nie możesz pisać wystarczająco szybko, aby zrobić różnicę w interaktywnej powłoce - dla której używam zsh. Ale w przypadku skryptów myślnik jest szybszy niż jakikolwiek inny, którego próbowałem.
mikeserv