Menyimpan output tanggal dan menonton perintah ke file

23

Saya seorang pemula untuk linux dan saya mencoba untuk menonton perintah dan mencoba untuk login ke file. Saya mencoba

watch -t -n 10 "(tanggal '+ WAKTU:% H:% M:% S'; ps aux | grep" pola "| wc -l)" >> logfile

dan saya mengharapkan hasil seperti

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

untuk disimpan dalam file log. Namun, ketika file log memiliki karakter yang tidak patut dicetak di. Bagaimana cara mendapatkan output seperti ini dari perintah li

LoudKur
sumber

Jawaban:

20

Untuk melakukan apa yang Anda cari, skrip sederhana (seperti yang ditunjukkan @Ignacio) harus melakukan trik:

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

Saya menggunakan teebukannya >>sehingga Anda dapat melihat output pada terminal Anda serta menangkapnya di log Anda.

Gereja
sumber
Saya sepertinya mendapatkan kesalahan dengan angka 1 di baris pertama. Tetapi ketika saya mengubahnya menjadi benar, itu berhasil. Namun output pada layar menunjukkan Waktu dan mengandalkan dua baris yang berbeda, tetapi file log hanya menunjukkan hitungan saja. Apakah ada cara saya bisa mendapatkan Waktu dan mengandalkan baris yang sama di file log?
LoudKur
Ah benar, karena perintah tee hanya berjalan untuk ps. Saya akan mengubah jawaban saya.
Kirk
Bekerja dengan sempurna! Terima kasih. Apakah ada cara saya dapat menambahkan timestamp ke logfile sehingga disimpan dalam file unik?
LoudKur
Anda bermaksud nama file log? Anda dapat melakukan sesuatu seperti file log. $ (Tanggal +% Y% m% d) untuk membuat file log baru setiap hari.
Kirk
Ya saya lakukan itu. Melampirkan kode sebagai jawaban untuk pertanyaan ini. Terima kasih!
LoudKur
37

Ini dapat dengan mudah dilakukan menggunakan watchjuga tanpa menggunakan skrip apa pun.

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

Kasun Gajasinghe
sumber
1
Benar. Saya menulis apa yang saya miliki di Mac, di mana arloji tidak tersedia di luar kotak, dan memilih solusi portabel. Milikmu jauh lebih sederhana.
Kirk
2
Dengan kata lain, sertakan pipa ke tee -a logfile dalam arg yang dilewati watch. Sangat bersih, terima kasih.
Wildcard
7

watchdimaksudkan untuk output ke tampilan. Jika Anda hanya ingin menjalankan perintah setiap X detik maka Anda hanya perlu menggunakan loop penundaan untuk itu.

while true ; do somecommand ; sleep 2 ; done
Ignacio Vazquez-Abrams
sumber
5

watch adalah program ncurses, dan dirancang untuk dijalankan di jendela konsol (tidak dialihkan), itulah sebabnya ia membuat banyak karakter yang tidak dapat dicetak (itu adalah karakter kontrol yang mengelola dan memindahkan kursor untuk menggambar ulang layar).

Anda dapat mencoba memindahkan perintah tanggal / grep ke dalam skrip, dan kemudian memanggil skrip tersebut dari cronjob.

Darth Android
sumber
3

Ok, jadi saya memasukkannya ke dalam skrip dan memiliki kode berikut:

#!/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
sumber
0

Saya menemukan pertanyaan ini ketika saya mencoba untuk mendapatkan yang lebih baik / keluaran log dari du -sh $data_path. Saya menggunakan pola "while command, do sleep" yang ditemukan di sini, tetapi menggunakan beberapa AWK yang kompleks untuk memberikan hasil yang saya inginkan.

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
}'

Saya benar-benar melakukan ini sebagai oneliner, itulah sebabnya ada titik koma. Tapi agar mudah dibaca, saya memecahkannya. Outputnya terlihat seperti:

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
sumber
0

Berikut adalah contoh saya hanya perlu untuk watchpada ps axfdengan stempel waktu di bagian bawah seluruh output. Saya menonton ketika Apache gagal. Saya harus menyalurkan ke teeuntuk setiap perintah, psdan 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'

Contoh Output tail --follow logfile-apache-issue.logpada file yang dihasilkan.

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
sumber