Czy istnieje sposób na wygenerowanie sygnału dźwiękowego -F?

23

Czy istnieje sposób na wygenerowanie tail -Flub lesswygenerowanie sygnału dźwiękowego (dzwonienie w terminalu), gdy pojawią się nowe dane (do pliku zostanie dodana nowa linia). Czy jest też jakieś inne narzędzie uniksowe, które może to zrobić na Linuxie lub Macu.

Ali
źródło

Odpowiedzi:

13

Idealnym pomysłem jest przepuszczenie wyjścia tailprzez sedi zastąpienie nowej linii dzwonkiem / nową linią.

Ale jest prawdopodobnie łatwiejsze rozwiązanie, jeśli używasz tailw oknie X-Window . Tam możesz wykonać akcję, gdy zmieni się zawartość okna (migotanie, dzwonek, cokolwiek).

Nils
źródło
4
Nie zastępuj nowego wiersza, dodaj go na końcu wiersza.
Kevin,
@Nils, ten sedpomysł jest genialny, ale nie wiem wystarczająco dużo „sed”, aby zadziałało, wygląda na to, że nie mogę przechwytywać nowych wierszy w wyrażeniu regularnym w zwykły sposób (do którego jestem przyzwyczajony). Chyba muszę powiedzieć sed nie interpretuj przychodzącego strumienia linia po linii.
Ali,
5
@Ali Rzeczywiście, sed działa linia po linii i nie widzisz bezpośrednio nowych linii. sed -e $'s/$/\a/'dodaje $'\a'(znak dzwonka w składni ksh / bash / zsh) na końcu każdej linii.
Gilles 'SO - przestań być zły'
Dzięki @Gilles, działało jak urok (również na Macu)! sedregexpt jest trochę dziwny dla moich naiwnych oczu.
Ali,
1
@Gilles: Pamiętaj, że $'...'składnia nie jest uniwersalna. Na przykład [t] csh nie obsługuje tego.
Keith Thompson
13

jeśli korzystasz z GNU screen, możesz ustawić go tak, aby „obserwował” okno ogonem, a na pasku stanu lub za pomocą dzwonka zdefiniowanego przez termcap ostrzeże cię, że w tym oknie pojawi się nowe wyjście.

http://www.gnu.org/software/screen/manual/html%5Fnode/Monitor.html#Monitor


edycja: po prostu musiałem to dodać, ponieważ wspomniałeś o Mac OS X

dla zabawy, jeśli szukasz czegoś konkretnego, możesz użyć polecenia Mac OS X, sayaby odczytać oglądany plik. po prostu pobierz logtailpolecenie z:

http://www.hmug.org/pub/MacOS_X/BSD/Administration/Log/logcheck/

I użyj go w skrypcie, takim jak:

#!/bin/bash

file=$1
offset=$(basename "$1")

# while true... let this thing run until it's killed...
while true; do
    output=$(/usr/local/bin/logtail $file .${offset}.offset)
    if [ ! -z "$output" ]; then

        # print the output and say ding
        echo "$output" && say ding
        # to have the file read aloud to you, uncomment the following:
        say "$output"

        fi
    # recheck every 5 seconds
    sleep 5
done
Tim Kennedy
źródło
Dzięki @Tim, screenpokazuje i ostrzega (myślę, że mogę sprawić, żeby zadzwonił również dzwonkiem) TYLKO RAZ. Nie dla każdego nowego wydarzenia, które się wydarzy (nie dla każdej nowej linii, która jest dostępna)
Ali,
1
dodałem przykład dla systemu Mac, który może odczytać plik. możesz to zmienić, aby działało w systemie Linux, instalując wersję logtail linuksa i używając beeppolecenia zamiast say.
Tim Kennedy,
fajne! Jest to kreatywne, chociaż w moim przypadku używam sygnału dźwiękowego, aby móc monitorować plik dziennika bez patrzenia na ekran. Rzeczywisty dźwięk może być lepszy niż głos.
Ali,
1
Można to również execzrobić za pomocą polecenia screen . Przykładem na stronie podręcznika jest to, !:sed -n s/.*Error.*/\007/pże wyśle ​​dzwonek za każdym razem, gdy w tym oknie jest wyświetlany komunikat „Błąd”.
Arcege
To samo dotyczy Tmux.
0xC0000022L
10

Możesz użyć multitaila . Jest to ulepszony ogon, który obsługuje wykonywanie poleceń w dopasowaniu wyrażeń regularnych.

Np. Następujące polecenie odtwarza dźwięk i otwiera okno xmessage przy każdym logowaniu pakietu źródłowego marsjańskiego .

multitail -ex "martian source" "play beep.wav; xmessage " -i /var/log/messages
andcoz
źródło
4

Dla przypomnienia, jak sugeruje @Nils, że używam sed do dodaniabell do każdej linii.

sedLinia dostarczone przez @Gilles

sed -e $'s/$/\a/' 

działa na moim komputerze Mac (w moim terminalu \ preferencje \ zaawansowane włączyłem „dźwiękowy dzwonek” i „wizualny dzwonek”).

Ali
źródło
Warto zauważyć, że $'...'sekwencje specjalne to tylko Bash.
amfetamachina
@amphetamachine dzięki, podczas gdy ja sam jestem użytkownikiem bash, byłoby miło, gdybyście ty lub inni mogli dodać wersje, które działałyby również na innych powłokach.
Ali
Jestem również użytkownikiem bash, ale powoli uczę się, co będzie działać, a co nie będzie działać w innych powłokach.
amfetamachina
1

Dla każdego, kto znajdzie tę stronę, używam tcsh i wygląda na to, że działa:

tail -f changingfile | sed -e 's/.*/& \a/'

Nie pytaj mnie, co oznacza składnia sed ...

raymond
źródło
1
Nie mogę się powstrzymać, muszę zapytać, czy możesz wyjaśnić sed wyrażenie?
Ashwani Agarwal
0

Możesz wypróbować konsoleopcję, która pozwala ostrzegać o nowej aktywności (lub ciszy) w dowolnej zakładce.

Aaron D. Marasco
źródło
Wyobrażam sobie, konsoleże to tak screen, jakby raz to ostrzegało, a ja muszę otrzymywać ostrzeżenie dla każdej nowej linii.
Ali,