skip to Main Content

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


  1. Chosen as BEST ANSWER

    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
    

  2. 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)

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search