Bagaimana cara mengukur berapa lama skrip saya dijalankan DAN memasukkannya ke dalam surel yang dihasilkannya?

11

Saya punya bash script sederhana yang menjalankan serangkaian pemeriksaan ( ping, nslookup, dll) dan kemudian mengirimkan laporan email dengan output dari data tersebut.

Saya ingin email memasukkan informasi tentang berapa lama waktu yang dibutuhkan untuk menjalankan seluruh skrip. Apakah ada cara mudah untuk mengumpulkan informasi itu?

Mike B
sumber

Jawaban:

15

Saya sarankan untuk melihat bashvariabel SECONDS:

DETIK : Setiap kali parameter ini direferensikan, jumlah detik sejak doa shell dikembalikan. Jika nilai ditetapkan ke DETIK, nilai yang dikembalikan setelah referensi berikutnya adalah jumlah detik sejak penugasan tersebut ditambah nilai yang diberikan.

Dengan demikian Anda cukup mencetak variabel ini di akhir skrip. Atau, jika niat Anda adalah untuk mengukur waktu hanya sebagian dari program, maka cukup atur SECONDS=0di awal blok perintah yang diukur, dan pada akhirnya cukup gunakan nilai yang disimpan dalam variabel ini.

jimmij
sumber
Saya tidak pernah tahu $SECONDS; itu hebat! Untuk menambah ini, Anda dapat mengkonversi detik menjadi jam: menit: detik dengan sesuatu seperti date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(lihat man dateopsi pemformatan lainnya).
Sparhawk
Saya sangat suka pendekatan ini tetapi saya masih sedikit bingung. Katakanlah saya menjalankan skrip yang sama beberapa detik terpisah satu sama lain. Jika saya mengatur SECONDS=0satu skrip dan hal yang sama pada skrip lain, akankah mereka saling mengganggu?
Mike B
3
Nevermind - Saya menemukan umpan balik Tom dalam posting Stack Overflow ( stackoverflow.com/a/5153036/344780 ) yang pada dasarnya mengurangi perbedaan START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Ini tampaknya sedikit lebih fleksibel untuk penggunaan simultan.
Mike B
8

Awali dengan perintah Anda /usr/bin/timedan perintah waktu akan menampilkan waktu yang dibutuhkan skrip untuk dijalankan. Ini lebih portabel daripada menggunakan sesuatu yang bashspesifik.

Steve Wills
sumber
6

Saat menggunakan SECONDSdan timeakan memberi Anda nilai relatif. Jika Anda ingin memiliki nilai absolut untuk Tujuan Audit dan Pelaporan tentang kapan skrip berjalan dan ketika skrip selesai, Anda mungkin ingin mencoba sesuatu seperti ini sebelum dan sesudah perintah Anda date '+%Y%m%d%H%M%S.%N'. Ini juga bisa memberi Anda rincian yang lebih baik karena dapat menangkap perbedaan sub-detik karena Anda memiliki perintah seperti pingyang biasanya dijalankan dalam satu detik.

rahul
sumber
1

Sarang skrip Anda. Untuk mengirim email ada sejumlah opsi. Saya pribadi mendukung msmtp untuk ini, Anda dapat menentukan sendiri judul "di sini" gaya (inline) atau menggunakan file terpisah dan cat bersama-sama. Ada segala macam alternatif untuk perl ini, python dll.

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"

Garis kosong yang tertinggal itu penting. cat pesan rakitan Anda ke msmtp dengan demikian:

cat assembled.eml | msmtp somebody@somewhere.else

Seorang pesimis akan berulang sampai berhasil beberapa kali.

Payload juga bisa berupa html, dan bisa dibuat php.

Alternatif yang sangat jelek untuk operasi "batchy" semalam katakan adalah membuat cronjob dan hasilnya diemail sebagai pengganti stdout / stderr.

mckenzm
sumber