Mengirim email dari baris perintah jika badan tidak kosong


12

Saya ingin menulis skrip sederhana yang mengingatkan saya jika ada perubahan log. Untuk ini saya menggunakan grep untuk menemukan garis yang saya minati. Sekarang ini berfungsi seperti ini:

grep line /var/log/file | mail -s Log email@domain.tld

Masalahnya adalah ini mengirim email bahkan jika tidak ada garis yang cocok ditemukan. Utilitas surat dari mailutils tampaknya tidak memiliki saklar yang memberitahukannya untuk menjatuhkan surat yang memiliki badan kosong.

Apakah ada cara cepat dan mudah untuk melakukannya?

Jawaban:


12
output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log email@domain.tld

Atau Anda dapat menjadikan ini sebagai pekerjaan cron dan kemudian jika menghasilkan output apa pun, itu akan mengirimkan email kepada pengguna. Anda dapat mengedit file / etc / aliases (dan kemudian menjalankan perintah newaliases) untuk mengirim email ke alamat yang tidak ada di kotak.

Entri entri cron (Anda tidak akan dapat mengatur thogh baris subjek

1 0 * * *  grep line /var/log/file

Atau Anda bisa mendapatkan utilitas ifne - Ini mungkin yang Anda inginkan

baris grep / var / log / file | ifne mail -s Log email@domain.tld

Perintah ifne tersedia dari epel repo untuk centos dan RHEL. Saya tidak dapat menemukan tautan ke halaman manual online tetapi itu ada

ifne (1)
ifne (1)

NAME ifne - Jalankan perintah jika input standar tidak kosong

SYNOPSIS ifne [-n] perintah

DESCRIPTION ifne menjalankan perintah berikut jika dan hanya jika input standar tidak kosong.

OPSI -n Operasi terbalik. Jalankan perintah jika input standar kosong.

          Note  that  if  the  standard  input  is not empty, it is passed
          through ifne in this case.

CONTOH temukan. -nama inti | ifne mail -s "File inti ditemukan" root

PENULIS Hak Cipta 2008 oleh Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
Perhatikan bahwa grep akan keluar dari non-0 jika tidak menghasilkan output, sehingga Anda dapat melakukan: output = $ (baris grep / var / log / file) && echo "$ output" | mail -s Log user@example.com
Sean Reifschneider

Juga, perintah yang Anda sarankan tidak mengirim "$ output" ke perintah mail. :-)
Sean Reifschneider

Saya akan menyarankan untuk mengedit jawaban untuk memasukkan solusi yang diusulkan oleh @Sean Reifschneider
Basil A

FYI ifneditemukan dalam moreutilspaket di ubuntu. Sayangnya paket itu juga membawa parallelkonflik dengan parallelperintah dari parallelpaket tersebut.
artfulrobot

14

"man mail" memberi tahu saya bahwa argumen -E berhenti mengirim email jika isi kosong. bekerja dengan baik untuk saya.

-E

Jika pesan keluar tidak mengandung teks apa pun di bagian pesan pertama atau hanya pesannya, jangan kirimkan tetapi buanglah dengan diam-diam, secara efektif mengatur variabel orang yang ada di startup program. Ini berguna untuk mengirim pesan dari skrip yang dimulai oleh cron (8).


3
Pada Ubuntu 12.04, GNU Mailtools 2.1 diinstal, dan opsi "-E" untuk "mail" ada singkatan untuk --exec. Itu tidak mengandung opsi "tubuh kosong".
Mark Stosberg

3
@MarkStosberg: Ubuntu memiliki beberapa paket alternatif yang menyediakan mailatau mailxperintah. The bsd-mailxdan heirloom-mailxpaket kedua memberikan mailxdengan -Epilihan yang dijelaskan di sini.
Smylers

1
Bekerja untuk saya di CentOS 6.5:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E mail@example.com
user2208096

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.