Cron-Job, der E-Mails in einem falschen Zeichensatz sendet

8

Ich habe folgenden Befehl in einem Cronjob:

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

Es gibt E-Mails in einem falschen Zeichensatz aus:

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

Aber wenn ich diesen Befehl direkt in der CLI starte und in ein Protokoll ausgebe:

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

Ich bekomme die richtige Kodierung - UTF-8

Es wurde bereits versucht, lang in / etc / environment festzulegen:

LANG=en_US.UTF-8

Cron neu gestartet, aber immer noch ANSI über CRON verwendet. Irgendwelche Ideen?

Alexander Kim
quelle
Stellen Sie die richtigen Umgebungsvariablen in der Crontab selbst ein, /etc/environmentdie von cron nicht berücksichtigt wird.
HBruijn
Ich glaube nicht, dass wir dies direkt beantworten können. Sie müssen selbst herausfinden, was in der Cron-Umgebung fehlt, und es hinzufügen. Diese Antwort hilft Ihnen beim Einrichten einer Cron-ähnlichen Umgebung, in der Sie arbeiten können.
user9517
Versucht, diese LANG-Variable in / etc / crontab hinzuzufügen - kein Effekt
Alexander Kim

Antworten:

13

Mein Problem wurde durch Hinzufügen zu einer Crontab behoben:

crontab -e

Am Anfang der Datei schrieb ich:

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

Jetzt sind alle meine Cron-Job-E-Mails in UTF-8-Zeichensatz.

Alexander Kim
quelle
1
Vielen Dank für die Veröffentlichung Ihrer Lösung! Ich habe auch dieses Problem gehabt. Übrigens ist es in Ordnung, Ihre eigene Antwort als akzeptiert zu markieren. Auf diese Weise machen Sie es noch hilfreicher, wenn Sie deutlich darauf hinweisen, dass dies eine Lösung ist. Vielen Dank!
imz - Ivan Zakharyaschev
Ich möchte jedoch darauf hinweisen, dass die Kommentare unter bugs.debian.org/cgi-bin/bugreport.cgi?bug=410057 , bugs.launchpad.net/ubuntu/+source/cron/+bug/1321227 , bugs.launchpad.net / ubuntu / + source / cron / + bug / 140896 schlägt vor, dass es ausreichen würde, korrekte Gebietsschemavariablen (LANG und LC_ *) in der Umgebung des Cron zu verwenden. Aber du hast geschrieben, das hat bei dir nicht funktioniert. Wie auch immer, die Lösung mit CONTENT_TYPEfunktioniert definitiv.
imz - Ivan Zakharyaschev
2

In Bezug auf dieses Problem habe ich in Debian Jessie in / etc / default / cron Folgendes gefunden:

# 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"

Mit anderen Worten, die Standardeinstellung ist, dass in dieser Distribution die Umgebungsdateien gelesen werden. Nach dem erneuten Ausführen dpkg-reconfigure locales(in meinem Fall war der Standardwert bereits auf UTF8 festgelegt) habe ich mir / etc / environment angesehen und festgestellt, dass es leer war. Nachdem ich dort eingefügt LC_ALL=en_US.UTF-8hatte, hatten die Cron-Job-E-Mails den richtigen Zeichensatz-Header.

Null
quelle
1

Wenn Sie den Befehl per CLI eingeben, erhalten Sie das utf-8-Chatset, glaube ich, weil Sie einen MAC OS-PC oder einen Linux-PC verwenden

Ich habe dies gesagt, weil das aktuelle LANG Ihres PCs in Ihrer SSH-Sitzung kopiert wird

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

von man 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.

Ihr crond-Prozess verwendet charset = ANSI_X3.4-1968. Möglicherweise ist dies die Standardsystem-LANG, aber wenn Sie dies ändern möchten

 man 5 crontab
c4f4t0r
quelle
1

Ich musste dieses Problem global für alle Benutzer lösen und nicht für einen bestimmten. Ich habe versucht, / etc / environment und / etc / default / locale einzurichten und dann cron neu zu starten. Das hat nicht geholfen. Die richtige Antwort für mich war die Verwendung des Befehls env im Upstart-Skript (ich verwende den Ubuntu-Server):

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

Dann habe ich cron neu gestartet und die richtige Mail in utf-8 erhalten.

Navern
quelle