Lưu trữ đầu ra của ngày và xem lệnh vào một tệp


23

Tôi là một người mới sử dụng linux và tôi đang cố gắng xem một lệnh và cố gắng đăng nhập nó vào một tập tin. Tôi đã thử

xem -t -n 10 "(ngày '+ TIME:% H:% M:% S'; ps aux | grep" mẫu "| wc -l)" >> logfile

và đang mong đợi một kết quả như

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

được lưu trữ trong logfile. Tuy nhiên, khi logfile có các ký tự không thể in được. Làm thế nào để tôi có được loại đầu ra này từ lệnh li

Câu trả lời:


20

Để thực hiện những gì bạn đang tìm kiếm, một tập lệnh đơn giản (như @Ignacio đã chỉ ra) nên thực hiện thủ thuật:

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

Tôi sử dụng teethay vì >>để bạn có thể thấy đầu ra trên thiết bị đầu cuối của mình cũng như nắm bắt nó trong nhật ký của bạn.


Tôi dường như nhận được một lỗi với 1 trong dòng đầu tiên. Nhưng khi tôi thay đổi nó thành sự thật, nó đã hoạt động. Tuy nhiên, đầu ra trên màn hình hiển thị Thời gian và đếm trên hai dòng khác nhau, nhưng tệp nhật ký chỉ hiển thị số đếm. Có cách nào tôi có thể lấy Thời gian và đếm trên cùng một dòng trong logfile không?
Lâu đài

À đúng rồi, vì lệnh tee chỉ chạy ps. Tôi sẽ sửa đổi câu trả lời của tôi.
Kirk

Hoạt động hoàn hảo! Cảm ơn. Có cách nào để tôi có thể thêm dấu thời gian vào logfile để nó được lưu trữ trong các tệp duy nhất không?
LoudKur

Bạn có nghĩa là tên logfile? Bạn có thể làm một cái gì đó như logfile. $ (Ngày +% Y% m% d) để tạo một logfile mới mỗi ngày.
Kirk

Ya, tôi đã làm điều đó. Đính kèm mã như một câu trả lời cho câu hỏi này. Cảm ơn!
LoudKur

37

Điều này có thể dễ dàng được thực hiện bằng cách sử dụng watchquá mà không sử dụng bất kỳ tập lệnh.

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


1
Chính xác. Tôi đã viết những gì tôi có trên máy Mac, nơi đồng hồ không có sẵn trong hộp và chọn giải pháp di động. Của bạn đơn giản hơn nhiều.
Kirk

2
Nói cách khác, bao gồm một đường ống đến tee -a logfile trong đối số được truyền tới watch. Rất sạch sẽ, cảm ơn bạn.
tự đại diện

7

watchcó nghĩa là cho đầu ra cho một màn hình. Nếu bạn chỉ đơn giản muốn chạy một lệnh mỗi X giây thì bạn chỉ nên sử dụng một vòng lặp trì hoãn cho điều đó.

while true ; do somecommand ; sleep 2 ; done

5

watch là một chương trình ncurses và được thiết kế để chạy trong cửa sổ giao diện điều khiển (không được chuyển hướng), đó là lý do tại sao nó tạo ra một loạt các ký tự không thể in được (đó là các ký tự điều khiển quản lý và di chuyển con trỏ xung quanh để vẽ lại màn hình).

Bạn có thể thử chuyển các lệnh date / grep thành một tập lệnh và sau đó gọi tập lệnh đó từ một cronjob.


3

Ok, vì vậy tôi đặt nó trong một tập lệnh và có đoạn mã sau:

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

Tôi đã gặp câu hỏi này khi tôi đang cố gắng để có được đầu ra tốt hơn / đăng nhập từ du -sh $data_path. Tôi đã sử dụng mẫu "while lệnh, do ngủ" được tìm thấy ở đây, nhưng đã sử dụng một số AWK phức tạp để đưa ra đầu ra mà tôi muốn.

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

Tôi thực sự đã làm điều này như một oneliner, đó là lý do tại sao có dấu chấm phẩy. Nhưng để làm cho nó dễ đọc, tôi đã phá vỡ nó. Đầu ra trông như sau:

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

Dưới đây là một ví dụ tôi chỉ cần cho một watchtrên ps axfmột dấu thời gian ở dưới cùng của toàn bộ đầu ra. Tôi đang theo dõi khi Apache thất bại. Tôi đã phải chuyển sang teetừng lệnh, psdate.

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'

Kết quả mẫu của tail --follow logfile-apache-issue.logtệp kết quả.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.