Shell – Script in cron cannot find command

cronopenstackshell-scriptUbuntu

I have a script which dumps out database and uploads the SQL file to Swift. I've run into the issue where the script runs fine in terminal but fails in cron.

A bit of debugging and I found that the /usr/local/bin/swift command is not found in the script.

Here's my crontab entry:

*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup  

Here's what I've tried:

  1. Using full path to swift as /usr/local/bin/swift
  2. Executing the /etc/profile script before executing the bash script.

How do I solve this?

Best Answer

Cron doesn't run with the same environment as a user. If you do the following you will see what I mean:

type env from your terminal prompt and make note of the output.

Then set a cron job like this and compare it's output to the previous:

*/5 * * * * env > ~/output.txt 

You will find that the issue is likely because crontab does not have the same PATH variable as your user. As a solution to this you can (from your postgres user) echo $PATH and then copy the results of that to the first line of your crontab (something like this)

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jbutryn/.local/bin:/home/jbutryn/bin

Or if you want to be more specific you can simply add the following:

PATH=$PATH:/usr/local/bin

However I normally always put my user's PATH in crontab because I haven't yet heard a good reason not to do so and you will likely run into this issue again if you don't.

Related Question