Ubuntuで(失敗した)cronジョブから電子メールを取得する方法は?


45

Ubuntuで実行可能ファイルをのいずれかに配置して、cronジョブを作成します/etc/cron.{daily,hourly,monthly,weekly}。cronで始まるディレクトリがたくさんあります。

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

次の場合にスクリプトから電子メールを取得したい:

  1. スクリプトは失敗し、ゼロ以外の終了コードを返します。
  2. スクリプトには、私に伝えることがあります

私が持っているSSMTPは、私はGoogleのアカウントから自分のメールを送信し、インストールして取り組んでいます。SSMTPが1つのアカウントを使用してしかメールを送信できないという事実は、私にとっては問題ではありません。これは単なるホームサーバーであり、私が持っているユーザーにはcronジョブを追加する機能がありません。

Linux / Unix全般、特にUbuntuで、スクリプトからのメール送信が通常どのように機能するかを知りたいと思います。また、上記の2つの状況でメールを受信するための良い方法を知りたいです。

回答:


60

デフォルトでは、cronはcrontabを実行しているアカウントの所有者にメールを送信します。

システム全体のcrontabは、ユーザー「root」の下で実行される/ etc / crontabにあります

ルートは広く使用されているため、とにかく/ etc / aliasesファイルにルートエイリアスを追加することをお勧めします。(後に「newaliases」を実行)

これを構成する通常の方法は、rootをシステム上の別のユーザーにエイリアスすることです。たとえば、私は「root」を「phil」(ユーザーアカウント)にエイリアスし、エイリアス「phil」を外部メールアドレスにエイリアスします。

出力時にメールで送信する特定のユーザーcronがある場合は、/ etc / aliasesを再度使用して(スーパーユーザーアクセス権がある場合)ユーザーを別のメールアドレスにリダイレクトするか、次のURLで使用できます。 crontabの上部:

MAILTO="email@domain.com"

メールをローカルユーザーに送信する必要がある場合は、代わりにユーザー名のみを入力できます。

MAILTO=someuser

さらに情報が必要な場合は、次を実行してcrontab(5)を参照してください。

man 5 crontab

/etc/aliasesエントリはフォーマット に従うことになっていないのですname: value1, value2, ...か?おそらく、過去8年間のある時点でフォーマットが変更された可能性があります。
ネイサンジョーンズ

1
「私にとっては、 'root'を 'phil'(ユーザーアカウント)にエイリアスし、エイリアス 'phil'を外部メールアドレスにエイリアスします。 " 「phil」を外部メールアドレスにエイリアスする方法は?
ハワードリー

29

vixie cronから電子メールを送信するには、sendmailコマンドを複製するものが必要です。したがって、postfixまたはSSMTPをインストールすると、この部分が整理されます。postfixを使用している場合、エイリアスファイルを使用して、システムユーザーを実際の電子メールアドレスにマッピングできます。

MAILTO = "foo@bar.com"をcrontabの上部に追加すると、cronジョブからの出力が電子メールで送信されます。これはエラーコードに関係ありません。

エラーをSTDERRに正しく出力するスクリプトの場合、エラーが発生した場合にのみ電子メールを受け取るのは簡単です。

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

これにより、STDOUTのみがnullにリダイレクトされます。STDERRメッセージが存在する場合、メールが届きます。

ただし、いくつかのスクリプトはSTDOUTとしてエラーを誤って出力し、終了コードを1に設定することがわかりました。これらから出力を取得する方法はわかりませんが、終了コードが0の場合は出力を無視します。出力をファイルにリダイレクトし、終了コードが0でない場合、cronが取得するためにそのファイルを出力することを考えることができます。しかし、かなり恐ろしいようです。



8

すべての出力(stdoutおよびstderr)を特定のアドレスに送信する場合は、MAILTO変数を使用できます。たとえば、次をスクリプトの上部に配置します。

MAILTO="address@example.com"

5

「root:your@email.address」を/ etc / aliasesに追加してみてください

そのユーザーのすべてのメッセージがメールに送信されます。すべてのメッセージが必要ない場合は、これ専用のユーザーを作成できます。

スクリプトが何かを出力する限り、メールが届きます。



2

私は、SSMTPがあなたがそれをするために必要とすることをしているとは思わない。cronプロセスからメールを「受信」して、実際のメールボックスに送信できるものが必要です。

私はSendmailを使用していますが、それは私が古いSunの手だからです。最近、Postfixを使用しているすべてのクールな子供たちに笑われることを知っています。あなたのubuntuコミュニティは、メールシステムのセットアップをガイドすることができます。


ssmtpは/ bin / sendmailを実装します
bobpaul

2

別の方法-すべてのルートメールをいくつかのファイルにアーカイブしてから、元のメールを削除します。

スクリプトをクローンします(ここが重要な部分です)-

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

これは物事を整頓し、私はそれに目を光らせることができます。毎日のメールファイルを外部のメールIDなどに送信できます。

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