本文が空でない場合にコマンドラインからメールを送信する


12

ログが変更された場合に警告する簡単なスクリプトを作成したいと思います。このために、私はgrepを使用して、興味のある行を見つけています。現在、次のように機能しています。

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

問題は、一致する行が見つからない場合でもメールを送信することです。mailutilsのメールユーティリティには、本文が空のメールをドロップするように指示するスイッチがないようです。

それを行うための迅速かつ簡単な方法はありますか?

回答:


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

または、これをcronジョブにして、出力が生成されると、ユーザーに電子メールで送信できます。/ etc / aliasesファイルを編集(およびnewaliasesコマンドを実行)して、ボックスにないアドレスにメールを送信できます。

cronエントリの例(件名行を設定することはできませんthogh

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

または、ifneユーティリティを入手できます-これはおそらくあなたが望むものです

grep行/ var / log / file | ifne mail -sログemail@domain.tld

ifneは、centosおよびRHELのepelリポジトリからコマンドを使用可能にします。オンラインでmanページへのリンクが見つかりませんが、

ifne(1)
ifne(1)

NAME ifne-標準入力が空でない場合にコマンドを実行します

構文ifne [-n]コマンド

説明ifneは、標準入力が空でない場合にのみ、次のコマンドを実行します。

オプション-n操作を逆にします。標準入力が空の場合、コマンドを実行します。

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

例find。名前コア| ifne mail -s "Core files found"ルート

著者:Copyright 2008 by Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
出力が生成されない場合、grepは0以外で終了するため、次のようにすることができます。output = $(grep line / var / log / file)&& echo "$ output" | mail -sログuser@example.com
ショーンレイフシュナイダー

また、提案されたコマンドは、「$ output」をメールコマンドに送信しません。:-)
ショーンレイフシュナイダー

私は@Sean Reifschneiderによって提案された解決策含めるように答えを編集することをお勧め
バジルA

参考までに、ubuntu ifnemoreutilsパッケージに含まれています。残念ながら、そのパッケージは、パッケージのコマンドparallelと競合するものももたらします。parallelparallel
artfulrobot

14

「man mail」は、引数-Eが本文が空の場合、メールの送信を停止することを示しています。私にとってはうまくいきます。

-E

送信メッセージの最初または唯一のメッセージ部分にテキストが含まれていない場合、メッセージを送信せずにサイレントに破棄し、プログラムの起動時にskipemptybody変数を効果的に設定します。これは、cron(8)によって開始されたスクリプトからメッセージを送信するのに便利です。


3
Ubuntu 12.04では、GNU Mailtools 2.1がインストールされており、「mail」の「-E」オプションには--execの省略形があります。「空のボディ」オプションは含まれていません。
マークストースバーグ

3
@MarkStosberg:Ubuntuには、mailor mailxコマンドを提供する複数の代替パッケージがあります。パッケージの両方を提供してここで説明するオプション。bsd-mailxheirloom-mailxmailx-E
スマイラーズ

1
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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.