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.