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

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.


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"


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

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.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.