crontabでエラーが発生すると、次のメッセージが表示されます。
cron: No MTA installed, discarding output
私のシステムにMTAをインストールしたくないが、これらのエラーメッセージも見逃したくない。
電子メールでこの情報を送信するように、cronはどこに設定されていますか?このメッセージがファイルに送信されるように変更できますか? (おそらくsysylog経由)。
すべてのcronメッセージを記録したくなく、エラーだけを記録したいと思います。
私のものrsyslog.conf
:
cron.=info stop
*.* |/dev/xconsole
残念ながら、エラーメッセージにも.info
ラベルがあるようです。
cronエラーのみを記録するにはどうすればよいですか?つまり、MTAがインストールされている場合はログファイルにどのように送信し、それ以外の場合はログファイルに何を送信しますか?
私のシステムは、ロギングに使用するDebian 10ですrsyslog
(systemdなし)。
修正する:
@basinが提案したように、各行に対して個別にリダイレクトを使用することはこれまで使用したソリューションであり、ほとんど問題なく動作します。
まず、前述したように、私は通常、MTAに送信されるコンテンツを別の場所、つまり|/dev/xconsole
各嘘を個別に指定せずに別の場所にリダイレクトするソリューションを望んでいます。
第二に、crontab行に構文エラーがある場合、リダイレクトは機能しません。 CronはまだMTAを介してエラーを送信しようとしており、No MTA installed
ログにエラーが表示されます。
MTAを介して送信されたコンテンツが(直接またはsysylogを介して)送信されるようにリダイレクトする方法はありますか/dev/xconsole
?
追加の質問:
提案されたソリューションを使用する場合は、@Binarus
独自のカスタムsendmail
スクリプトを作成してください。
デフォルト値を使用する代わりに、/usr/sbin/sendmail
カスタムスクリプトに別の場所を指定できますか/usr/local/sbin/sendmail
?の情報はどこにありますかcron
?これはハードコードされていますか?それとも、cronの設定ファイルのいずれかで設定できますか?sendmail
/usr/sbin/
ベストアンサー1
私は解決策があると思いますが、半分だけテストしました。残念ながら、私のシステムにそのデバイスがないのでテストすることができず/dev/xconsole
、それが何であるかもしれないし、見る時間もないことを認めます。
しかし、2つの利点があります。まず、以下の方法は一般的です。つまり、/dev/xconsole
私が使用したもの以外のファイル名をほぼ確実に使用できます。第二に、私はただDebian Busterでテストしたので、実際にはすぐに動作します。
まず、(非常に簡単な)解決策を紹介し、どのように動作するかを説明し、いくつかの考えられる問題とそれを回避する方法を紹介します。
解決策
注意事項としてまず保有していることを確認してください/usr/sbin/sendmail
。これはしなければならないいいえそうですね。このプログラムは通常MTAに属していますが、MTAがインストールされていないと言われています。存在する場合は、含まれているパッケージを削除します。
/usr/sbin/sendmail
次に、次の内容でスクリプトを作成します。
#!/bin/bash
cat >>/root/result
それに応じて権限を設定します。
chmod a+rx,u+w,og-w /usr/sbin/sendmail
再起動cron
:
systemctl restart cron
それだけです。。cron
通常、電子メールを介して送信されるすべてのエラーメッセージはここに入ります/root/result
。
もちろん、上記の手順はrootユーザーとして実行する必要があります。
/root/result
あなたの場合は、おそらく次のように変更したいと思います/dev/xconsole
(しかし、上記のようにこれをテストしていないことに注意してください:-))。そして結局は次のよう>>
に置き換えなければなり>
ません(しかし私はそれについて全く知らないので/dev/xconsole
、この内容は間違っているかもしれません。)
どのように動作しますか?
定義:以下では、SENDMAILを使用してSENDMAILパッケージを参照し、sendmail
アプリケーションを参照します。
電子メールメッセージを送信するほとんど(または少なくとも多くの)プログラムは、ソケットまたはネットワーク接続を介してMTAと直接通信する必要があるSMTPプロトコルスタックをデフォルトで実装せず、セキュリティの観点からSMTPライブラリを含めません。間違いは致命的であり、ほとんどの場合、特別なアプリケーションが救出されるので、これは必要ありません。
これらの特別なアプリの1つは、/usr/bin/sendmail
SMTPなどが含まれており、非常に使いやすいということです。一般的なパターンは次のとおりです。
cat MyMailMessage | /usr/bin/sendmail [sendmail-options]
# OR, even shorter
/usr/bin/sendmail <MyMailMessage
つまり、アプリケーションはメールメッセージを構成し(いくつかのヘッダーと本文のみを必要とするため、非常に簡単です)、それをサーバーにパイプし、sendmail
サーバーは再びSMTP魔法を実行します。
歴史的に、SENDMAILはかつて基本的なMTAでした。 SENDMAILにはMTAだけでなく、MSP(Message Submission Program)も含まれています。 MSP部分は/usr/sbin/sendmail
長い間SENDMAILを削除することができなかったため、多くのアプリケーションは実際にはまだメール送信者として機能するか、依存してい/usr/sbin/sendmail
ました。sendmail
そのため、SENDMAILの競合他社(POSTFIXなど)でも、このプログラムを互換性ラッパーとして提供しています。
cron
この点で、その動作は他のアプリケーションと同様です。 SMTPをサポートしていません。代わりにsendmail
実際にメッセージを送信することに依存します。ヘッダーと本文を含む生メッセージを構成し、sendmail
実際に送信するようにパイプされます。
/usr/sbin/sendmail
だから私は上記のスクリプトに置き換えました(MTAをインストールしたので、これは単にテスト用でした)。電子メールを送信しようとするとcron
呼び出される/usr/sbin/sendmail
これが私たちのスクリプトです。スクリプトは単に標準入力を受け取り、ファイルにリダイレクトします。
ちなみに、cron
元の電子メールメッセージを直接ここにパイプするのかsendmail
、それとも最初に一時ファイルに入れてから、そのファイルからリダイレクト呼び出しをするのかsendmail
、stdin
それとも別の操作を実行するのか、実際にはわかりません。
しかし、ここではこれは重要ではありません。重要なのは、それぞれの場合に元の電子メールメッセージが で構成され、 の に保存されることですcron
(ただし、cron
これを行うことができます)。sendmail
stdin
欠点、問題、改善点
cat
スクリプト内での使用は、効率性の点で最良の選択ではないかもしれませんが、予想される出力に依存します。スクリプトをファイルに配置する最良の方法を説明する多数の記事がありますstdin
。これはあなたの質問の範囲に含まれていないようです。
私の解決策の1つの欠点は明らかです。 「実際」が必要な場合は/usr/sbin/sendmail
問題があります。微妙なものを想像できます。見つかったかどうかに応じて動作するいくつかのアプリケーションがあるかもしれません/usr/sbin/sendmail
。
たとえば、アプリケーションが実行可能ファイルを検出した場合はエラーを電子メールで送信することを決定でき、そうでない場合はログファイルにエラーを記録できます。これでアプリケーションの動作が変わります。次のことは状況によって大きく異なります。まず、一般的な場所ではエラーメッセージが見つからない可能性があります。第二に、sendmail
これは単純なスクリプトであり、アプリケーションが期待どおりに機能しないため、奇妙なことが発生する可能性があります。
しかし、解決策があります。再コンパイルを許可すると言われましたcron
。私はソースコードにそれが使用するMSP名の定義がconfig.h
あると信じています(しかし、今は確認できません)。#define
解決策は明らかです。スクリプトの名前を次のように変更し、abcd1234
それを値として使用するか#define
、おそらくより良い方法で、スクリプトを別のディレクトリに配置します。いいえシステムの検索パスからスクリプトのフルパスを#define
。
これは別の#define
;しかし、スクリプトは単に無視するので、スクリプトに害を及ぼすことはありません。おそらく、cron
スクリプトと直接エラー出力を目的のファイルまたはデバイスに直接ダンプすることもできます。これが可能かどうかを判断するには、ソースコードの追加分析が必要ですが、まだ実行していません。私は何が起こってもスクリプトに固執します。 1つの大きな理由は、次の段落を参照してください。
[2021年10月20日更新:
2021年10月20日、元の質問に対する私の意見で述べたように、再コンパイルを防ぐことができる問題を解決する代替方法があります。 「実際」をsendmail
別の場所に移動し、その場所にスクリプトをインストールすることです。次に、スクリプトが実行されるたびに誰が呼び出したかを調べます。呼び出された場合はcron
上記のように機能し、そうでない場合はsendmail
同じ引数、つまりstdin
「relay」と「real」stdin
を使用して「real」を呼び出すようにしますsendmail
。
]
別の問題は、興味のあるエラーメッセージが表示されるだけでなく、それを見るたびにヘッダーを含む元のcron
電子メール全体が送信されることです。回避策は、使用やgrep
友達sed
など、興味のない行をフィルタリングするいくつかのコードをスクリプトに追加することです。しかし、それもこの質問の範囲外です。