10

ある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" example@example.com < test

しかし、シェル コマンド ラインで exec.sh を直接実行すると、メールにテキストが表示されます。

4

4 に答える 4

12

私自身も同じ問題に遭遇しましたが、テキスト出力をパイプしてmailx- Heirloom mailx 12.4 7/29/08

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

これを理解するためにいくつかの調査が必要でしたが、次のようになります。

問題

Mailx は、テキスト入力で未知の文字や制御文字に遭遇した場合、それを application/octet-stream mime-type が設定された添付ファイルに変換します。

マニュアルページから:

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

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

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

しかし、私はノルウェー語の UTF8 文字を持っていたので: æøå - リストが拡張され、そのようなリストを維持したくないので、ノルウェー語の文字が必要です。

添付ファイルを調べると、\r、\n 32 ~ 176 の範囲の「通常の」ASCII 文字しかないことがわかりました。すべて印刷可能で、 184 および 195 --> UTF8です。

ソリューション

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

LANG="en_US.UTF8" ; export LANG

exportシェルで実行するか、またはsetenv実行する場合は、ロケールの設定を確認します。cshtcsh

説明

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

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

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

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

参考文献:

于 2014-06-27T12:20:40.240 に答える
1

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

#/bin/sh

に置き換えられます

#!/bin/sh

問題に来て

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

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

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

説明

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

または、次のようなフルパスを使用してみてください

./opt/bin/analysis.sh > test 
mail -s "Today's Weather" example@example.com < /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
于 2013-09-25T08:26:42.780 に答える
0

私の場合、cron はシェル スクリプトではなく PHP スクリプトでした (そのため、これを入れることができませんでしたexport LANG)。

0 9 * * * apache php /test/myscript.php | mail -s "CRON - myscript" foo@bar.com

解決:

同じ問題 (コンテンツが本文ではなく添付ファイルとしてメールで送信される) を修正するためにLANG=fr_FR.UTF-8、cron ファイルの先頭に次のように追加します。

MAILTO=vme1.etc-crond-backoffice-conf
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
LANG=fr_FR.UTF-8

0 9 * * * apache php /test/myscript.php | mail -s "CRON - myscript" foo@bar.com

注意:ファイルを入れてcronサービスを再起動してもうまくいきLANG=fr_FR.UTF-8ました。/etc/environment


参照:

于 2021-09-27T13:06:58.657 に答える