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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .