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を直接実行すると、電子メールにテキストが表示されます。誰かに説明してもらえますか。ありがとうございます。
私自身も同じ問題に遭遇しました。テキスト出力を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の問題が疑われます。
参照:
私はこれと同じ問題を抱えていましたが、上記のどれも問題を修正しませんでした。ファイル内の余分なリターンを移動すると、問題が修正されました。
cat logfile | tr -d \\r | mailx -s'the logfile' to-me@.....
このフォーラムに感謝します:
https://forums.opensuse.org/showthread.php/445955-mailx-creates-unwanted-attachment
スクリプトでこれを変更してください
#/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