2

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
  • Set error_reporting to E_ALL. Also remove this which php and instead invokevusing /usr/bin/env php script Commented Nov 3, 2019 at 12:06
  • @MarcinOrlowski I did test and didn't work. The script doesn't has error. Even set the shebang and invoking with absolute path, './opt/project/script.php', the cron jog was called but the script was not executed. Commented Nov 3, 2019 at 13:08

2 Answers 2

1

Please try:

* * * * * /full/path/to/your/run_script.sh

instead:

* * * * * cd /opt/project && sh run_script.sh

if you want your bash or sh script to be executed the path to the script should be absolute path as above or:

./run_script.sh

note the ./. otherwise the script will not be executed.

also make your bash script exectuable by:

chmod +x run_script.sh

you may also run the script directly without run_script.sh from cron:

* * * * * /absolute/path/to/php -f "/absolute/path/to/script.php"

for changing current directory to the one that your php script sits in you may use this at the beginning of your php script:

chdir(dirname(__FILE__));

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)

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

4 Comments

I made the changes. I checked that setting chdir wherever the script path is executed will be where the script is. The cron job is executed, I can see the logs, if I put some output in shell script the file with content is created, but the run scrpt.php by shell or directly set it in the crontab -e doesn't work. I did already set cron job under /etc/init.d and right in /etc/crontab, with root ahead command.
if I set a cron job to out put my cron environment I see the PATH and SHELL variables as I set before the job.
@LeandroArruda have you tried /absolute/path/to/php -f "/absolute/path/to/script.php" ? what was the result?
Yes. I put with double quotes. The script works manually, I'm set cron jobs with root user.
0

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:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
14,29,44,59 * * * * root export INFORMIXSERVER=<data_source_name> && export INFORMIXDIR=<path_to_informix_sdk> && export INFORMIXTMP=<path_infomix_tmp> && export INFORMIXSQLHOSTS=<path_to_sqlhost_file> && export $PATH:$INFORMIXDIR/bin && /usr/bin/php /opt/project/script.php &> /var/log/project/task.log

Comments

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.