2

Although I checked the canonical issue for cron, I couldn't solve the problem. Why is my crontab not working, and how can I troubleshoot it?

So, here I go:

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, and gene

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
*/14 * * * * /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
*/14 * * * * 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
*/14 * * * * 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
*/14 * * * * 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.

10
  • Its likely not the issue, but why "*/14" - that would seem unusual ?
    – davidgo
    Nov 2, 2019 at 17:56
  • @davidgo That is just to execute to each 14 minutes. I put the real scenario, but didn't work with to each minute — * * * * * user command. Nov 2, 2019 at 18:00
  • That's bizarre. What file are you editing? (Also, */15 might be better as 60 mins in an hour, but running every minute should not give you problems if syntax is correct)
    – davidgo
    Nov 2, 2019 at 18:05
  • @davego I need to query informix database before 15-30-45-59:99 minute of each hour. These samples is from crontab. I'm editing type crontab -e. The server has a lot of cron job running, but this others cron jobs was put it directly inside '/etc/cron.d', And has a lot of php scripts runnings as cron jobs. I tried to puts also at this path, but doesn't work, even to each minute of each hour. Nov 2, 2019 at 18:11
  • Are you root when you are editing them? Have you tried editing /etc/crontab directly (in /etc/crontab you specify the user who runs it, when running crontab -e I believe it edits the users crontab so you dont specify the user - and maybe the problem is its running with incorrect syntax or wrong user?
    – davidgo
    Nov 2, 2019 at 20:51

2 Answers 2

1

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
1

I've been wandering in the wasted land for years looking for the solution. Thanks for tackling this issue. Initially I thought the same as you did but couldn't figure out how to fix it. It is an edge case, I guess. In my case, though; there's a slight difference in that I'm using Informix SDK for connecting a remote db. The SDK is mandatory (weird) with an exception of java (and maybe python) language (which has its own JDBC driver).

Anyways, I just needed setting the default INFORMIXDIR path.

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/4.10
0 * * * * root export INFORMIXDIR=/opt/IBM/informix/4.10 && /usr/bin/php /opt/local/myScript.php >> /var/log/myLog.log 2>&1
1
  • The main issue is that Informix variables must be in the user of server environment and in the cron environment. I did try using only IINFORMIXDIR, but I needed to export all variables as I did to work. Another info, the database was in a cluster and if one host was down another took the place, but the manager do not setted alias for host and didn't accept my ask, so I need to configure INFORMIXSQLHOSTS to have all servers available and treat it in script to check wath host was active at moment. Nice to see a confirmation for this. May 7, 2020 at 13:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.