Crontab not executing commands in docker - php

I'm building a web app where instructors provide courses and customers buy them.
I needed automation for changing courses statuses. Pretty much just checking some conditions and e.g. closing course when the current time is greater than deadline.
I'm using php-symfony, everything is dockerized. So to access my php container, I have to start docker-compose and type docker-compose exec php bash. Well in php I have a command which I can run manually, to check all the courses statuses and possibly do some changes to database if the conditions are met. But to automate this process, I decided to use crontabs. I've tested the command in cmd whether I have all the access to do such thing and it worked, so I just put it into crontab to execute every minute.
* * * * * cd /home/martin/PhpstormProjects/bp_project && sudo docker-compose exec php php bin/console courses-check >/dev/null 2>&1
The first parts gets to the project folder, the second part opens docker container and runs the command that checks courses statuses. In cmd the whole command worked. And even in /var/log/syslog which is supposed to be default crontab logging file, it gave me this output:
May 8 16:42:01 martin-ubuntu CRON[1032921]: (martin) CMD (cd /home/martin/PhpstormProjects/bp_project && sudo docker-compose exec php php bin/console courses-check >/dev/null 2>&1)
I don't see any visible errors but looking in the database, it didn't change any values while it should.
So I was thinking it could be something with docker?
I tried to add second command in crontab which is:
* * * * * cd /home && echo "hi" > a.txt
And it was saving "hi" into given file every minute.
So while the first command doesn't work, this one does. Any ideas where is the hidden problem?

change your crontab into this
* * * * * sudo docker-compose -f /home/martin/PhpstormProjects/bp_project/docker-compose.yml run --rm php sh -c ' bin/console courses-check' >/dev/null 2>&1

Related

Can't run symfony commands from cron in docker

I'm trying to run cron job with symfony commands. I have this crontab.
* * * * * cd /var/www && /usr/local/bin/php bin/console app:cron:commands > output.txt
I tested if Cron is running by
* * * * * cd /var/www && touch output.txt
this worked and created file.
Then I tried if php is runnig by
* * * * * cd /var/www && /usr/local/bin/php --version > output.txt
this also worked and I got php version output into file output.txt
Last what I tried was
* * * * * cd /var/www && /usr/local/bin/php bin/console about > output.txt
and also now I got output.
I'm trying to figure it out for 2 day's I'm desperate. I can't figure out where is the problem. Symfony command run from command line just fine.
When I was writing this post I run last test I tried to create new test command and use part of the command I can't make run I think was creating problem. It works I don't know why. Difference is only in ownership of the commands. Command I can't run is owned by root and the test command I created is owned by 1000. Can this be the problem?
Edit: I changed ownership to 1000. Nothing change still didn't run from cron.
This probably has the answer:
How to use crontab to execute a Symfony command
Try this
* * * * * cd /var/www && /usr/local/bin/php bin/console app:cron:commands > output.txt -e prod
If you are using the docker container to run php, you might need to use the container in cron:
docker exec -it name_of_your_container php /var/www/example.net/bin/console about > output.txt

Linux scheduled task not working in Laravel

The below cronjob is not working, although the task itself is working when I manually run it using php artisan q:calc .
I just added the path for php and artisan files as shown below, and pasted the command in the terminal.
Am I missing something ?
* * * * * /usr/bin/php /var/www/html/sharp/artisan schedule:run >> /dev/null 2>&1
That command is a cron entry, not something you run in terminal.
For example, under the specific user you would run (depending on your environment):
$ crontab -e
And paste the above to the crontab file.
You can learn more in the docs:
https://laravel.com/docs/master/scheduling
Or by researching how to add cron entries for your specific operating system.

Running codeigniter 3 cron job issue

I'm trying to run a codeigniter 3 cron job. If I open the file manually it works through the browser and I find databse updated and emails are sent
https://www.example.com/module_name/controller/method
But not working through a cron job like this every minute on a private server
curl --silent https://www.example.com/module_name/controller/method
Also tried
/usr/local/bin/php /home/username/public_html/index.php module_name controller method
Any idea or other ways to run it?
I'd first go to a terminal and check that your php is actually at /usr/local/bin/php by running:
which php
You mentioned that you'd like to know other ways to run the cron, and I've used wget many times. For you that would look something like:
/usr/bin/wget https://www.example.com/module_name/controller/method -O /dev/null
In most(all?) Linux distros, you're going to open crontab for editing using:
crontab -e
Once in there, just add a line:
* * * * * /usr/bin/wget https://www.example.com/module_name/controller/method -O /dev/null
Do ensure that you have wget available, and it's location by running:
which wget

Crontab on dedicated Ubuntu server

I have a php script I want to execute regularly using a crontab. I've done it on my own Apache/Ubuntu 11.04 server by using this code:
*/10 * * * * cd /var/cron/ && /usr/bin/php -q script.php && echo "Update Successful: $(date)" >> update.log
But on my dedicated server (Ubuntu 10.04) I can't get the crontab to execute the script, no matter what I try. I can't find the php binary using "locate php | grep bin" but I've tried referring to both the /etc/apache2/php.ini and the php.ini-production.cli files and a countless other ways recommended online.
I have the file-setup exactly the same on both servers, and have tried executing the php script outside the crontab and it works fine. Also, if I don't try to execute the php script but just uses it to put the text into the log file, the crontab work as well. Would be thankful for some advice! :)
can't you just use
*/10 * * * * /usr/bin/php -q /path/to/file/script.php
I add
> /dev/null 2>&1
to the end to chuck out any output.
and put the logging in script.php
I actually figured it out after many hours of despair. First I had to:
sudo apt-get install php5-cli
sudo updatedb
And finally remove a hash in /etc/php5/cli/conf.d/mcrypt.ini which was causing a failure cause of depreciation. Now it works! Thanks for you time though Dagon!

How to update code using svn with crontab?

I am using following steps to update code on server after login to server:
sudo -s
<wrote password here>
cd /var/www/staging
rm -r app.old
mv app app.old
svn checkout https://example.com/projectname/trunk/app app
Now I created update.sh file in /var/www/ with following content
cd /var/www/staging
rm -r app.old
mv app app.old
svn checkout https://example.com/projectname/trunk/app app
And I have following crontab entry to run after every 5 minutes:
*/5 * * * * /var/www/update.sh
Problem: So cron job is working but it is only deleting the app folder and not checking out it from svn repository. But when I run bash /var/www/update.sh manually it works fine after sudo -s.
How to fix this for cron job as well. Is it related to sudo -s or something else?
Thanks
I suspect the problem is that the job is running from cron as root and root user doesn't have permissions to checkout.
First, I suggest that you include details of the username/password to use with SVN - inside your script:
svn checkout --username USER --password PASS ttps://example.com/projectname/trunk/app app
Next, change the line in your crontab to this:
*/5 * * * * /var/www/update.sh 2>&1| mail -s "Cron job execution" youremail#wherever.com
Then, when the job executes, any errors would be sent to you via email. At least you'll see what is going wrong.
If you need to run it as a different user, then install it on that users crontab. Rather than trying to sudo over in the script.

Categories