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?
If yes, continue reading this article!
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:
| From the command line | From a cron job |
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= |
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?
Some people say that you need to add the following environment variables to the crontab entry:
SHELL=/bin/bash LANG=en_US.UTF-8 LANGUAGE=en LC_CTYPE=en_US.UTF-8
But this actually didn’t work for me.
What you can do instead is create (if not already present) the file /etc/environment and add the following line:
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 cron restart
Hope this will fix your characters problem.
#1 by weakish on 27 Apr 2010 - 11:50
/etc/environment is deprecated, but cron somehow need it.
Details: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543895
#2 by jinhao on 07 May 2010 - 19:30
thx,very useful and clear.
#3 by carlos on 19 Aug 2010 - 15:04
very clear and useful, since /environment is deprecated, man crontab didnt clear enought about setting a real locale settings
#4 by Tiger on 13 Dec 2011 - 09:54
Thank you, one shot in google and my scripts works properly
#5 by Omar Shibli on 05 Jan 2012 - 11:47
Thanks a lot.
p.s. the above “service cron restart” command didn’t work for me, so i tried this instead “/etc/rc.d/init.d/crond restart”.
#6 by smoreau on 05 Jan 2012 - 11:57
Yes, this is perfectly fine to run the command
/etc/rc.d/init.d/crond restartinstead.If you want to use the command
service cron restart, you would need to install the service tool using the following command: