Running a simple shell script as a cronjob

128,728

Solution 1

What directory is file.txt in? cron runs jobs in your home directory, so unless your script cds somewhere else, that's where it's going to look for/create file.txt.

EDIT: When you refer to a file without specifying its full path (e.g. file.txt, as opposed to the full path /home/myUser/scripts/file.txt) in shell, it's taken that you're referring to a file in your current working directory. When you run a script (whether interactively or via crontab), the script's working directory has nothing at all to do with the location of the script itself; instead, it's inherited from whatever ran the script.

Thus, if you cd (change working directory) to the directory the script's in and then run it, file.txt will refer to a file in the same directory as the script. But if you don't cd there first, file.txt will refer to a file in whatever directory you happen to be in when you ran the script. For instance, if your home directory is /home/myUser, and you open a new shell and immediately run the script (as scripts/test.sh or /home/myUser/scripts/test.sh; ./test.sh won't work), it'll touch the file /home/myUser/file.txt because /home/myUser is your current working directory (and therefore the script's).

When you run a script from cron, it does essentially the same thing: it runs it with the working directory set to your home directory. Thus all file references in the script are taken relative to your home directory, unless the script cds somewhere else or specifies an absolute path to the file.

Solution 2

Try,

 # cat test.sh
 #!/bin/bash
 /bin/touch file.txt

cron as:

 * * * * * /bin/sh /home/myUser/scripts/test.sh

And you can confirm this by:

 # tailf /var/log/cron

Solution 3

Specify complete path and grant proper permission to scriptfile. I tried following script file to run through cron:

#!/bin/bash
/bin/mkdir /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/crondir

And crontab command is

* * * * * /bin/bash /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/test.sh

It worked for me.

Share:
128,728
tomtomssi
Author by

tomtomssi

BY DAY: A Software Developer BY NIGHT: Working for Calicode

Updated on August 10, 2020

Comments

  • tomtomssi
    tomtomssi over 3 years

    I have a very simple shell script I need to run as a cronjob but I can't get even the test scripts to run. Here's and example script:

    /home/myUser/scripts/test.sh

    #!/bin/bash
    touch file.txt
    

    crontab:

    * * * * * /home/myUser/scripts/test.sh
    

    The script runs fine from the terminal but can't get it to run as a cronjob. So far I've tried these in crontab:

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    * * * * * /bin/bash /home/myUser/scripts/test.sh
    

    And this in the the script file:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myUser/scripts
    

    From what I've gathered the solution might be in the PATH variable but I can't figure out what it is since my understanding is very limited at this point. So my question is, how do I get my scripts to run as cronjobs?

    EDIT: the file has rwx permissions for all users. This is just for testing purposes.

    EDIT: cronjobs such as * * * * * touch /home/myUser/scripts/test.txt work but it wont run scripts.