I have a php script that queries a MySQL and IBM Informix database (located in other host), generates json files, handles the information and inserts it into the MySQL database.
The script has a main file and another that has the query handling functions. Staying like this:
/opt/project
script.php
functions.php
The script.php requires the functions.php file, generate json where is being executed based on queries to databaes, and inserts the data handled.
I can run the script smoothly using absolute or relative path.
Inside /opt/project:
# php script.php
Somewhere else:
# /usr/bin/php /opt/project/scrpt.php
However, when its executed by cron job, doesn’t work. I did already set up informing environment variables, performed log tests, and even created a shell script to run script.php with cron running the shell script.
Server PATH (CentOS 7): /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
Crontab contents tried:
SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * /usr/bin/php /opt/project/script.php
With root ahead command:
SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * root /usr/bin/php /opt/project/script.php
Changing directory:
SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * cd /opt/project && /usr/bin/php script.php
Cron to run shell script instead php directly:
SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * cd /opt/project && sh run_script.sh
Where shell script has the following content:
#!/usr/bin/env bash
cd /opt/project
PHP=`which php`
$PHP script.php
The cron logs didn’t show anything wrong, and if I redirect the output to a file it’s create the file, but didn’t run the php script, even by shell script to do that. I tried with not set SHELL and PATH in the crontab, but doesn’t work too.
2
Answers
The problem was the variables of the SDK to connect with IBM Infomix database. Although I had set the PATH, it was necessary to export the environment variables from IBM Informix that I define when I did install the Informix SDK. The strange was that even with the PDO exeptions no one error was generate when I redirect error standard output with &>.
May exist an most elegant way to do that but I can't play with live environment. Follow that cron job that currently works:
Please try:
instead:
if you want your bash or sh script to be executed the path to the script should be absolute path as above or:
note the
./
. otherwise the script will not be executed.also make your bash script exectuable by:
you may also run the script directly without
run_script.sh
from cron:for changing current directory to the one that your php script sits in you may use this at the beginning of your php script:
because when you run php script by cron then the current dir for php is not the script but different (due to the fact it was started by cron)