4

I have a cron job that runs once a day on a Linux server and in the script it executes there is a test:

# Validate ffmpeg is installed
if [ $(which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
    echo "error: ffmpeg is not installed!" | tee -a "$log"
    exit 1
fi 

Every day when I check the logfile, the message ffmpeg is not installed! is in the log and as result the work has not been executed. If I run the which test in the shell everything works fine and when I execute the script everything works.

Is there something intrinsic to cron that prevents it from being able to properly use the which command?

user9517
  • 117,122

2 Answers2

8

At the top of your crontab file put SHELL and PATH declaration like:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

See this SE post for more details.

The default SHELL and PATH for cron are SHELL=/bin/sh, PATH=/usr/bin:/bin (From man 5 crontab man page).

6

It probably does not pick up your path since it's running from cron. There are several ways to make it know the path the easiest I have found is just hard code the path to which.

Do a:

locate which

Mine returns this:

[user@server ~]$ locate which |grep bin
/usr/bin/which

Then change your script to do:

if [ $(/usr/bin/which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
    echo "error: ffmpeg is not installed!" | tee -a "$log"
    exit 1
fi 

Another option is to set the environment and path in the crontab:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
J Baron
  • 338
  • 1
  • 7