UTF-8 for Linux Crontab Scripts

Do you get special characters problem when executing your bash script from a cron job? And does the same script work fine when it is directly executed from the command line?

The reason of this characters problem is probably because of your locale settings.

Indeed, If you try to run the command locale from the command line and from a cron job, you may get different results such as:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

… but when running that command as a cron job and piping the results to a file in /tmp, I got the following…

LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

As you can see, the cron job is not using UTF-8. That must be the problem!

So the question now is how to change the locale settings for the cron job?

The solution was to set the LANG in the /etc/environment file like this…

LANG=en_US.UTF-8

The cron process will read this file when it starts, so you need to restart it in order to apply the change:

service crond restart
# /etc/rc.d/init.d/crond restart

The /etc/environment file is used to set variables that specify the basic environment for all processes so should be the best place to set the LANG variable.

Comments

Popular posts from this blog

Reduce TIME_WAIT Socket Connections