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.

  • Its likely not the issue, but why "*/14" - that would seem unusual ? – davidgo Nov 02 '19 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. – Leandro Arruda Nov 02 '19 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 02 '19 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. – Leandro Arruda Nov 02 '19 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 02 '19 at 20:51
  • Are you aware you can use "14,29,44,59 * * * *" to precisely say what minutes you want it to run on? – davidgo Nov 02 '19 at 20:52
  • @davidgo I will try directly at /etc/crontab, bu after, can you answer if this affect another cron jobs? Because there a lot of them, and all put it write the file in '/etc/cron.d'. No I didn't. Thanks, it will be more meaningful. – Leandro Arruda Nov 02 '19 at 21:30
  • @davidgo the script generates files. That was set to be generate where the script will run, /opt/project. Has some to care about that. The script is run perfectly by root use. And the cron jobs are being create by root, but only with crontab -e and right in /etc/cron.d. I wait your reply to my last comment to test editing /etc/crontab. – Leandro Arruda Nov 02 '19 at 21:35
  • You can put cron jobs in any of the locations it looks for them and it will not affect other cron jobs. I normally put cronjobs which the root user deals with in /etc/crontab – davidgo Nov 02 '19 at 21:50
  • Let us [continue this discussion in chat](https://chat.stackexchange.com/rooms/100622/discussion-between-leandro-arruda-and-davidgo). – Leandro Arruda Nov 02 '19 at 22:49

2 Answers2

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
G Wolfe
  • 11
  • 2
  • 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. – Leandro Arruda May 07 '20 at 13:04
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