user3726871
user3726871

Reputation: 21

Bash Script works but not in when executed from crontab

I am new to linux and the script below is just an example of my issue:

I have a script which works as expected when I execute it however when I set it to run via crontab it doesn't work as expected because it doesn't read the file content into the variable.

I have a file 'test.txt' which has 'abc' in it. My script puts the text into a variable 'var' and then I echo it out to a log file:

var=$(</home/pi/MyScripts/test.txt)
echo "$var" >/home/pi/MyScripts/log.log

This works perfectly fine when I execute it and it echo's into the log file but not when I set it via crontab:

* * * * * /home/pi/MyScripts/test.sh

The cron job runs, and it sent me the following error message:

/bin/sh: 1: /home/pi/MyScripts/test.sh: Permission denied.

But I have given it 777 permissions:

-rwxrwxrwx 1 pi pi   25 Jun 10 15:31 test.txt
-rwxrwxrwx 1 pi pi   77 Jun 10 15:34 test.sh

Any ideas?

Upvotes: 1

Views: 2124

Answers (3)

Jonathan Wheeler
Jonathan Wheeler

Reputation: 2699

You have two options. In the first line of your file, tell what program you want to interpret the script

#!/bin/bash
...more code...

Or in your crontab, tell what program you want to interpret the script

* * * * * bash /home/pi/MyScripts/test.sh

In this option, you do not need to make the script executable

Upvotes: 0

Giacomo1968
Giacomo1968

Reputation: 26066

Others have provided answers, but I will give you a big clue from your error message; emphasis mine:

/bin/sh: 1: /home/pi/MyScripts/test.sh: Permission denied.

Note how the cron job was trying to use /bin/sh to run the script. That’s solved by always indicating which shell you want to use at the top of your script like this.

#!/bin/bash
var=$(</home/pi/MyScripts/test.txt)
echo "$var" >/home/pi/MyScripts/log.log

If your script is using bash, then you must explicitly set /bin/bash in some way.

Also, regarding permissions you say this:

But I have given it 777 permissions:

First, 777 permissions is a massive security risk. If you do that it means that anyone or anything on the system can read, write & execute the file. Don’t do that. In the case of a cron job the only entity that needs 7 permissions on a file is the owner of the crontab running that file.

Meaning if this is your crontab, just change the permissions to 755 which allows others to read & execute but not write. Or maybe better yet change it to 700 so only you—as the owner of the file—can do anything to the file. But avoid 777 permissions if you want to keep your system safe, stable & sane.

Upvotes: 1

that other guy
that other guy

Reputation: 123410

This happens when you run the script with a different shell. It's especially relevant for systems where /bin/sh is dash:

$ cat myscript 
echo "$(< file)"

$ bash myscript
hello world

$ sh myscript

$ 

To fix it, add #!/bin/bash as the first line in your script.

Upvotes: 2

Related Questions