crontab execution doesn't have the same environment variables as executing user

Cron always runs with a mostly empty environment. HOME, LOGNAME, and SHELL are set; and a very limited PATH. It is therefore advisable to use complete paths to executables, and export any variables you need in your script when using cron.

There are several approaches you can use to set your environment variables in cron, but they all amount to setting it in your script.

Approach 1:

Set each variable you need manually in your script.

Approach 2:

Source your profile:

. $HOME/.bash_profile (or . $HOME/.profile)

(You will usually find that the above file will source other files (e.g. ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*) - if not, you can source those as well.)

Approach 3:

Save your environment variables to a file (run as the desired user):

env > /path/to/my_env.sh

Then import via your cron script:

env - `cat /path/to/my_env.sh` /bin/sh

Approach 4:

In some cases, you can set global cron variables in /etc/default/cron. There is an element of risk to this however, as these will be set for all cron jobs.


Cron creates its OWN shell with the use specified through which it will run.

So, if you want to keep the same variable of your user, then try to run it with your own user, instead of root or any other user.

Or

The best way is that export those variables in your own script.


In RedHat CentOS, you could set /etc/rc.d/init.d/functions default PATH to permanently set. /etc/rc.d/crond calls functions when starts.