web-dev-qa-db-ja.com

crontabジョブを使用してメールを送信します。メールテキストは、ATT00001.binという名前の添付ファイルに変わります。

1つのLinuxサーバーでいくつかのデータを分析し、それを電子メールテキストとして電子メールアカウントに送信したいのですが、シェルコマンドでこのシェルスクリプトを実行すると、うまく機能します。奇妙なことに、すべての手順をcrontabジョブに入れると、電子メールのテキストは添付ファイルに変わります、誰か助けてもらえますか?

#* * * * * sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1

/* exec.sh */
#/bin/sh
cd /opt/bin
./analysis.sh > test
mail -s "Today's Weather" [email protected] < test

しかし、シェルコマンドラインでexec.shを直接実行すると、電子メールにテキストが表示されます。誰かに説明してもらえますか。ありがとうございます。

11
Alex

私自身も同じ問題に遭遇しました。テキスト出力をmailxにパイプしているだけです-Heirloommailx 12.4 7/29/08

コマンドラインでスクリプトを実行すると、電子メールは本文付きの通常の電子メールとして送信されました。
ただし、crontabを介してまったく同じスクリプトを実行すると、電子メールの本文が添付ファイルとして届きました-ATT00001.BIN(Outlook)、application/octet-stream(mutt)、または "noname" (Gmail)。

これを理解するためにいくつかの調査を行いましたが、ここに行きます:

問題

Mailxは、テキスト入力で不明な/制御文字を検出した場合、application/octet-streammime-typeが設定された添付ファイルに変換します。

マニュアルページから:

改行と水平タブレータ以外のフォーマット文字を含むファイルの場合

したがって、これらの制御文字を削除する必要があります。これは、trで実行できます。

echo "$Output" | /usr/bin/tr -cd '\11\12\15\40-\176' | mail ...

ただし、ノルウェー語のUTF8文字を使用していたため:æøå-リストが拡張され、そのようなリストを維持する必要はありません。ノルウェー語の文字が必要です

そして、添付ファイルを調べたところ、\ r、\ n「通常の」ASCII範囲32〜176の文字-すべて印刷可能and184および195-> UTF8

ソリューション

スクリプトでロケールを明示的に設定します。

LANG="en_US.UTF8" ; export LANG

シェルでexportを実行します。setenvまたはcshを実行する場合はtcshを実行して、ロケールが何に設定されているかを確認します。

説明

Mailx(シェルで実行する場合)は、LANGを.UTF8に設定して、UTF8文字を正しく識別して続行します。

crontabで実行する場合、LANGは設定されず、デフォルトでLANG = Cになります。これは、デフォルトではcrontabが制限された環境変数のセット(システムに依存)のみを実行するためです。

mailx(または他のプログラム)は、UTF8文字を認識せず、入力に不明な制御文字が含まれていると判断します。

私の問題はUTF8文字でした。入力内の他の制御文字である可能性があります。 hexdumpまたはod -cを実行しますが、通常のシェルでは問題なく動作するため、LANGの問題が疑われます。

参照:

11
sastorsl

私はこれと同じ問題を抱えていましたが、上記のどれも問題を修正しませんでした。ファイル内の余分なリターンを移動すると、問題が修正されました。

cat logfile | tr -d \\r | mailx -s'the logfile' to-me@.....

このフォーラムに感謝します:

https://forums.opensuse.org/showthread.php/445955-mailx-creates-unwanted-attachment

8
adivis12

スクリプトでこれを変更してください

#/bin/sh

に置き換えられます

#!/bin/sh

問題に直面する

スクリプトは、特定のディレクトリから実行されていることを前提としています(ほとんどすべてのパスは、絶対パスではなく相対パスであることに注意してください)。 cronはたまたま別のディレクトリから実行しています。

電子メールに表示されるテキストの修正

mydir=$(dirname "$0") && cd "${mydir}" || exit 1
./opt/bin/analysis.sh > test 
mail -s "Today's Weather" [email protected] < /opt/bin/test

説明

$ 0は、実行されているシェルスクリプトの(おそらく相対的な)ファイル名です。ファイル名を指定すると、dirnameコマンドはファイル名を含むディレクトリを返します。したがって、その行は、ディレクトリをスクリプトを含むディレクトリに変更するか、dirnameまたはcdのいずれかが失敗した場合にエラーコードで終了します。

またはのようなフルパスを試してください

./opt/bin/analysis.sh > test 
mail -s "Today's Weather" [email protected] < /opt/bin/test

注:同じ問題については前に説明しました ここ

フォローアップ:

削除してみてください

sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1

代わりに

sh /opt/bin/exec.sh 2>&1 >> /opt/bin/mailerror

フォローアップ

Crontabコマンドを使用してファイルを編集しない場合、変更を有効にするにはcronを再起動する必要があります。

crontab -l > oldcrontab
cp oldcrontab newcrontab
echo "$newline" >> newcrontab
crontab < newcrontab
1
SriniV