web-dev-qa-db-ja.com

cronジョブが間違った文字セットでメールを送信する

私はcronjobに次のコマンドを持っています:

*/5 * * * * php /var/www/domain/yii rss/parse

それは間違った文字セットでメールを出力します:

Content-Type: text/plain; charset=ANSI_X3.4-1968

しかし、そのコマンドをCLIで直接起動してログに出力すると、次のようになります。

php /var/www/domain/yii rss/parse > log

適切なエンコーディングを取得-UTF-8

すでに/ etc/environmentにlangを設定しようとしました:

LANG=en_US.UTF-8

Cronを再起動しましたが、それでもCRON経由でANSIを使用します。何か案は?

7
Alexander Kim

Crontabに追加して私の問題を解決しました:

crontab -e

私が書いたファイルの上部に:

CONTENT_TYPE="text/plain; charset=utf-8"

これで、私のcronジョブの電子メールはすべてUTF-8文字セットになっています。

13
Alexander Kim

Debian Jessieの/ etc/default/cronにある次の問題を見つけました。

# Whether to read the system's default environment files (if present)
# If set to "yes", cron will set a proper mail charset from the
# locale information. If set to something other than 'yes', the default
# charset 'C' (canonical name: ANSI_X3.4-1968) will be used.
#
# This has no effect on tasks running under cron; their environment can
# only be changed via PAM or from within the crontab; see crontab(5).
READ_ENV="yes"

つまり、デフォルトでは、このディストリビューションでは環境ファイルを読み取ります。再実行後dpkg-reconfigure locales(私の場合、デフォルトはすでにUTF8に設定されています)/ etc/environmentを調べたところ、空であることがわかりました。挿入したらLC_ALL=en_US.UTF-8そこに、cronジョブの電子メールは正しい文字セットヘッダーが含まれていました。

2
ñull

CLIでコマンドを入力すると、MAC OS PCまたはLinux PCを使用しているため、utf-8チャットセットを取得したと思います

あなたのPCの現在のLANGがあなたのsshセッションでコピーされ始めたので、私はこれを言いました

grep -i LANG /etc/ssh/sshd_config 
AcceptEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES

男sshd_configから

AcceptEnv
             Specifies what environment variables sent by the client will be copied into the session’s environ(7).  See SendEnv in ssh_config(5) for how to
             configure the client.  Note that environment passing is only supported for protocol 2.  Variables are specified by name, which may contain the
             wildcard characters ‘*’ and ‘?’.  Multiple environment variables may be separated by whitespace or spread across multiple AcceptEnv directives.
             Be warned that some environment variables could be used to bypass restricted user environments.  For this reason, care should be taken in the
             use of this directive.  The default is not to accept any environment variables.

あなたのcrondプロセスはcharset = ANSI_X3.4-1968を使用しています、おそらくこれがデフォルトのシステムLANGですが、これを変更したい場合

 man 5 crontab
1
c4f4t0r

この問題は、特定のユーザーではなく、すべてのユーザーに対してグローバルに解決する必要がありました。/etc/environmentと/ etc/default/localeを設定してから、cronを再起動しようとしました。これは役に立ちませんでした。私にとっての正解は、upstartスクリプトでenvコマンドを使用することでした(私はubuntuサーバーを実行しています)。

env LC_ALL = en_US.UTF-8

cat /etc/init/cron.conf 
# cron - regular background program processing daemon
#
# cron is a standard UNIX program that runs user-specified programs at
# periodic scheduled times

description     "regular background program processing daemon"

start on runlevel [2345]
stop on runlevel [!2345]

expect fork
respawn
env LC_ALL=en_US.UTF-8

exec cron

次に、cronを再起動し、utf-8で正しいメールを取得しました。

1
Navern