Zapisz dane wyjściowe polecenia date i watch w pliku

23

Jestem nowicjuszem w Linuksie i próbuję obejrzeć polecenie i próbuję zalogować się do pliku. próbowałem

zegarek -t -n 10 "(data '+ CZAS:% H:% M:% S'; ps aux | grep" wzorzec "| wc -l)" >> plik dziennika

i oczekuję wyniku takiego jak

TIME: 10:32:30    12
TIME: 10:32:40    18
TIME: 10:32:50    2

do zapisania w pliku dziennika. Jednak gdy plik dziennika zawiera wewnątrz znaki, które nie mogą być drukowane. Jak uzyskać tego rodzaju dane wyjściowe z polecenia li

LoudKur
źródło

Odpowiedzi:

20

Aby zrobić to, czego szukasz, prosty skrypt (jak wskazał @Ignacio) powinien załatwić sprawę:

while true
do
    echo "$(date '+TIME:%H:%M:%S') $(ps aux | grep "pattern" | wc -l)" | tee -a logfile
    sleep 2
done

Używam teezamiast >>, abyś mógł zobaczyć wynik na swoim terminalu, a także przechwycić go w swoim dzienniku.

Kościół
źródło
Wydaje mi się, że pojawia się błąd z 1 w pierwszym wierszu. Ale kiedy zmieniłem to na true, zadziałało. Jednak dane wyjściowe na ekranie pokazują Czas i liczą się w dwóch różnych wierszach, ale plik dziennika pokazuje tylko liczbę. Czy jest jakiś sposób, aby uzyskać czas i liczyć na tę samą linię w pliku dziennika?
LoudKur
Ach tak, ponieważ polecenie tee działa tylko dla ps. Zmodyfikuję swoją odpowiedź.
Kirk
Działa świetnie! Dzięki. Czy jest jakiś sposób, aby dodać znacznik czasu do pliku dziennika, aby był on przechowywany w unikatowych plikach?
LoudKur
Masz na myśli nazwę pliku dziennika? Możesz zrobić coś takiego jak plik dziennika. $ (Data +% Y% m% d), aby codziennie tworzyć nowy plik dziennika.
Kirk
Tak, zrobiłem to. Załączam kod jako odpowiedź na to pytanie. Dzięki!
LoudKur,
37

Można to łatwo zrobić za pomocą watchrównież bez użycia skryptów.

watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l) | tee -a logfile"

Kasun Gajasinghe
źródło
1
Poprawny. Napisałem to, co miałem na komputerze Mac, gdzie zegarek nie jest dostępny od razu po wyjęciu z pudełka, i wybrałem przenośne rozwiązanie. Twoje jest znacznie prostsze.
Kirk
2
Innymi słowy, to rury do tee -a logfile wewnątrz Arg przekazane watch. Bardzo czyste, dziękuję.
Wildcard,
7

watchjest przeznaczony do wyświetlania na wyświetlaczu. Jeśli po prostu chcesz uruchamiać polecenie co X sekund, powinieneś po prostu użyć do tego pętli opóźniającej.

while true ; do somecommand ; sleep 2 ; done
Ignacio Vazquez-Abrams
źródło
5

watch to program ncurses, który został zaprojektowany do uruchamiania w oknie konsoli (bez przekierowywania), dlatego tworzy grupę znaków niedrukowalnych (są to znaki sterujące, które zarządzają i przesuwają kursor w celu przerysowania ekranu).

Możesz spróbować przenieść komendy date / grep do skryptu, a następnie wywołać ten skrypt z cronjob.

Darth Android
źródło
3

Ok, więc umieszczam go w skrypcie i mam następujący kod:

#!/bin/sh
NOW=$(date '+%Y%m%d%H%M%S')
LOGFILE="log.$NOW"

while true
do
    echo $(date '+[TIME: %H:%M:%S]   Output: ' ; ps aux | grep "pattern" | wc -l ) | tee -a $LOGFILE
    sleep 2
done
LoudKur
źródło
0

Natknąłem się na to pytanie, gdy próbowałem uzyskać lepsze / zarejestrowane dane wyjściowe du -sh $data_path. Użyłem wzorca „while while, do sleep” znalezionego tutaj, ale użyłem złożonego AWK, aby uzyskać pożądany wynik.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

Zrobiłem to jako oneliner i dlatego są średniki. Ale żeby było czytelne, wyrwałem to. Dane wyjściowe wyglądają następująco:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
Bruno Bronosky
źródło
0

Oto przykład, którego potrzebowałem dla a watchon ps axfze znacznikiem czasu na dole całego wyjścia. Czekam na awarię Apache. Musiałem potokować do teekażdego polecenia, psi date.

watch 'ps axf | grep --line-buffered "[a]pache2"| tee --append logfile-apache-issue.log; date '+TIME:%H:%M:%S' | tee --append logfile-apache-issue.log'

Przykładowe dane wyjściowe tail --follow logfile-apache-issue.logpliku wynikowego.

29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:13
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:15
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:16
Elijah Lynn
źródło