Làm cách nào có thể đo được mất bao lâu để tập lệnh của tôi chạy VÀ đưa nó vào email mà nó tạo ra?


11

Tôi có một kịch bản bash đơn giản mà chạy một loạt các kiểm tra ( ping, nslookup, vv) và sau đó gửi một báo cáo email với đầu ra của dữ liệu đó.

Tôi muốn email bao gồm thông tin về việc mất bao lâu để toàn bộ tập lệnh chạy. Có một cách dễ dàng để thu thập thông tin đó?

Câu trả lời:


15

Tôi đề nghị hãy xem bashbiến SECONDS:

GIÂY : Mỗi lần tham số này được tham chiếu, số giây kể từ khi gọi shell được trả về. Nếu một giá trị được gán cho SECONDS, giá trị được trả về cho các tham chiếu tiếp theo là số giây kể từ khi gán cộng với giá trị được gán.

Do đó, bạn có thể chỉ cần in biến này ở cuối tập lệnh. Ngoài ra, nếu ý định của bạn là đo thời gian chỉ là một phần của chương trình, thì chỉ cần đặt SECONDS=0ở đầu khối lệnh được đo và cuối cùng chỉ sử dụng giá trị được lưu trữ trong biến này.


Tôi chưa bao giờ biết về $SECONDS; thật tuyệt! Để thêm vào điều này, bạn có thể chuyển đổi giây thành giờ: phút: giây với nội dung tương tự date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(xem man dateđể biết thêm tùy chọn định dạng).
Sparhawk 8/2/2015

Tôi thực sự thích cách tiếp cận này nhưng tôi vẫn hơi bối rối. Giả sử tôi chạy cùng một kịch bản cách nhau vài giây. Nếu tôi đặt SECONDS=0trên một tập lệnh và điều tương tự trên một tập lệnh khác, liệu chúng có can thiệp lẫn nhau không?
Mike B

3
Nevermind - Tôi tình cờ thấy phản hồi của Tom trong bài đăng Stack Overflow ( stackoverflow.com/a/5153036 4324780 ) về cơ bản trừ đi sự khác biệt START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Điều này có vẻ linh hoạt hơn một chút để sử dụng đồng thời.
Mike B

8

Tiền tố lệnh của bạn với /usr/bin/timevà lệnh thời gian sẽ xuất ra thời gian để tập lệnh chạy. Điều này là di động hơn so với việc sử dụng một cái gì đó bashcụ thể.


6

Trong khi sử dụng SECONDStimesẽ cung cấp cho bạn các giá trị tương đối. Nếu bạn muốn có các giá trị tuyệt đối cho Mục đích kiểm toán và báo cáo khi kịch bản chạy và khi hoàn thành, bạn có thể muốn thử một cái gì đó như thế này trước và sau các lệnh của bạn date '+%Y%m%d%H%M%S.%N'. Điều này cũng có thể cung cấp cho bạn mức độ chi tiết tốt hơn vì nó có thể nắm bắt sự khác biệt của giây phụ khi bạn có các lệnh như pingthường thực hiện trong vòng một giây.


1

Nest kịch bản của bạn. Để gửi email có một số tùy chọn. Cá nhân tôi ủng hộ msmtp cho việc này, bạn có thể tự xác định tiêu đề theo kiểu "ở đây" (nội tuyến) hoặc sử dụng một tệp riêng và ghép chúng lại với nhau. Có tất cả các loại thay thế cho điều này liên quan đến perl, python, vv

Reply-To: someone@somehost
Sender: someone <someone@somehost>
To: somebody@somewhere.else
Subject: some subject
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset="iso-8859-1"

Các dòng trống là quan trọng. gửi tin nhắn được lắp ráp của bạn vào msmtp như vậy:

cat assembled.eml | msmtp somebody@somewhere.else

Một người bi quan sẽ lặp đi lặp lại cho đến khi thành công một số lần hợp lý.

Tải trọng cũng có thể là html và có thể là php được tạo.

Một thay thế rất xấu cho hoạt động "hàng loạt" qua đêm là tạo ra một cronjob và đầu ra được gửi qua email thay cho stdout / stderr.

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.