web-dev-qa-db-ja.com

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

Ubuntuで実行可能ファイルを/etc/cron.{daily,hourly,monthly,weekly}の1つに配置して、cronジョブを作成します。 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つの状況でメールを受信するための良い方法についても知りたいです。

46
Deleted

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

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

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

これを構築する通常の方法は、システムの別のユーザーにrootをエイリアスすることです。私にとっては、 'root'を 'phil'(私のユーザーアカウント)にエイリアスし、 'phil'を私の外部電子メールアドレスにエイリアスします。

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

MAILTO="[email protected]"

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

MAILTO=someuser

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

man 5 crontab
62
Philip Reynolds

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

MAILTO = "[email protected]"をcrontabの先頭に追加すると、cronジョブからの出力がメールで送信されます。これはエラーコードに関係ありません。

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

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

これにより、STDOUTだけがnullにリダイレクトされます。 STDERRメッセージが存在する場合は、メールで通知されます。

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

29
Theozaurus

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

MAILTO="[email protected]"
8
Dan Carley

/ etc/aliasesに「root:[email protected]」を追加してみてください

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

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

5
Daniel P

通常、毎日約20のcronjobsを実行するすべてのプロダクションサーバーで、python-cronwrapパッケージを使用して誓います。こちらで確認してください: http://pypi.python.org/pypi/cronwrap 。設定は本当に簡単で、何よりも信頼できます。

3
Low Kian Seong

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

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

2

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

スクリプトをcronします(ここに重要な部分があります)-

#!/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などに送信できます。

2
irdroid3