Reputation: 446
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);
}
Upvotes: 4
Views: 791
Reputation: 73271
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.
Upvotes: 5