Reputation: 665
So I have a script to download a file from AWS daily and append it to a spread sheet. To do this I have set up a cronjob.
The Script works fine when I run it manually, but does not work when running from the cronjob.
The code has a line:
aws s3 cp s3://My/files/backup/ ~/home/AnPoc/ --recursive --exclude "*.tgz" --include "*results.tgz"
And in the email I recieve from the cronjob execution, I see the following error message:
./AnPoc/DayProcessing.sh: line 14: aws: command not found
I don't know why the command is not being found. Any help would be great.
Upvotes: 45
Views: 25789
Reputation: 311
If you install aws console using snap then the absolute/executable address will be like /snap/bin/aws otherwise its looks like /usr/bin/aws . It can be different according to your installation.
You can find this path using $ whereis aws
.
eg :
snap/bin/aws s3 sync --exclude "/path to exclude" /pathtosync s3://bucketname/
Upvotes: 0
Reputation: 1274
You should use the full path for the aws
command. For example, /usr/local/bin/aws
Upvotes: 36
Reputation: 3933
If you have aws in your profile, you could also include your profile by adding . $HOME/.profile
* * * * * . $HOME/.profile; /path/to/command
Upvotes: 0
Reputation: 2837
The only thing that worked for me was to specify the path explicitly in the script:
ROOTDIR=/home/myusername
LOGDIR=$ROOTDIR/logs
DUMPDIR=$ROOTDIR/db_backup
LOGFILE=$LOGDIR/db_backup.log
$ROOTDIR/.local/bin/aws s3 cp $DUMPDIR/myappname-`date +"%Y-%m-%d"` s3://my-bucket-name/backups/myappname-`date +"%Y-%m-%d"` --recursive >> $LOGFILE 2>&1
As a previous poster said, use which aws
to find the location of aws.
Upvotes: 3
Reputation: 761
Put this code before your command line to be executed into crontab -e
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Upvotes: 10
Reputation: 9282
First: check where on your system the executable aws
is stored. Use this command:
$ which aws
/usr/bin/aws # example output, can differ in your system
Now, place a variable called $PATH
in your crontab before the script:
PATH=/usr/bin:/usr/local/bin
Those paths separated by :
define where should be search for the exectable. In the example above it's /usr/bin
. You have to check all executables in your cron job that they are available.
Another thing: try to avoid path with a tilde (~
) in cronjobs. Use /home/user
instead.
Upvotes: 67