4

I understand SO is for questions but no matter how many tutorials I have looked up, I cannot get my crontab to work and I am building an website that will rely on crontab to reset a particular setting in my database every night.

Here is my crontab file:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
* * * * * /usr/bin/php -q  /var/www/html/cron/index.php

If I try to cd to /usr/bin/php i get

-bash: cd: /usr/bin/php: Not a directory

So I cd'd to just /usr/bin/ and this is what i found:

-rwxr-xr-x  1 root   root      27216 Feb 10 15:08 pgrep*
lrwxrwxrwx  1 root   root         21 Jun 13 09:36 php -> /etc/alternatives/php*
-rwxr-xr-x  1 root   root    9049256 Jul  2 11:57 php5*

If I cd to /etc/alternatives I find:

lrwxrwxrwx  1 root root   13 Jun 13 09:36 php -> /usr/bin/php5*

I go back to the bin file, php5 has the * symbol and is green.

-rwxr-xr-x  1 root   root    9049256 Jul  2 11:57 php5*

My PHP script. Very simple. Checks for a cookie and if it exists increments it by one. I then check the results on another page. Manually this works. With crontab, cannot get it to work.

if (!empty($_COOKIE['cronTest'])) {
  $int = $_COOKIE['cronTest'];
  $int++;
  setcookie("cronTest", $int, time()+3600);
}
6
  • My question over there was just put on hold because it doesn't "work yet" Commented Aug 2, 2015 at 2:09
  • 3
    @RichardErickson careful when recommending sites you're not familiar with. Please see A guide to Code Review for Stack Overflow users. Commented Aug 2, 2015 at 2:12
  • what happens when you run /usr/bin/php -q /var/www/html/cron/index.php from the command line ? Commented Aug 2, 2015 at 2:47
  • @Mat'sMug Thank you for correcting me. I deleted my erroneous comment. Commented Aug 2, 2015 at 23:42
  • 1
    Dave, sorry for sending you the the wrong site. Commented Aug 2, 2015 at 23:43

1 Answer 1

5
  • Most likely, your script inside /var/www/html/cron is owned by www-data user. Depending on your setup the user executing the cronjob doesn't have permissions to run this file.

  • There are no $_COOKIEs on the command line. A cookie is sent by the users browser. As cli isnt a browser, so you can't read the cookies value. Though you could access a users $_SESSION, but that's another story. Have a look here Is it possible to read cookie/session value while executing PHP5 script through command prompt? for further details.

Your cronjob line looks valid, so the problem will be one of above points. To verify the first, try something without the use of $_COOKIE in your file, like simply

mkdir('/var/www/html/cron/testdir');

just to see if the file can be accessed and a directory is created inside above dir. If it can't be accessed, create a new group and add both the current user ( find out with

ls -al

in /var/www/html/cron ) and the user running the cronjob to the group, then make that group own the file you want to run. See the accepted answer on this question: Set user permissions | Artisan command will not run in code but works fine on command line I posted some time back on how to do that.

For the $_COOKIE problem, you will have to find another solution. For example use Redis or Memcached as a caching service that can be accessed both by online and cli configurations.

Consider to add

1>> /dev/null 2>&1

to the end of your cronjob line, if you don't do so and let cron run this every minute, you will get masses of logfiles.

For the sake of completenes on possible pitfalls when working with php and the cli, allways make sure to provide full paths to your files.

Sign up to request clarification or add additional context in comments.

3 Comments

I was merely using cookies to see if crontab was working. ThanK You for the tips. I will implement and see if they work.
You're welcome, let me know if I can help you any further.
That worked. The test I was using was wrong and it was because of my misunderstanding of $_COOKIES. Thank you for explaining that concept to me. Dually noted for the future

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.