3

I have some cronjob that sometimes gets stuck in running status.

That makes me think that for some reason they produce an error but I cannot find any related log. ( the column messages in cron_schedule is empty )

How can I be sure cron execution produces logs in case of errors?
How can I proceed to debug this issue, any advice?

UPDATE
It looks like my question is not clear, so I'm adding some more content ( I am not sure it gonna help because most of the people seem to read the title and guess the question ... )

  • I know how cron works
  • I know how to check if a cronjobs run or not
  • My cronjobs correctly run

The problem is some of the cronjobs do not end.

To be more clear: Mage_Cron_Model_Observer::_processJob()

  $schedule
        ->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', time()))
        ->save();

    call_user_func_array($callback, $arguments);

    $schedule
        ->setStatus(Mage_Cron_Model_Schedule::STATUS_SUCCESS)
        ->setFinishedAt(strftime('%Y-%m-%d %H:%M:%S', time()));

The status is never reached for some cron, that is the problem.

Please avoid give the random answer or just the first result google provide ( I know how to use google, I did my research ... )

If the answer is not clear, just let me know.
If you wanna help you are more than welcome if you just won't waste my and your time you are not. ( this site is meant for quality answers, it is not a forum where everybody says his opinion ... posting not related answers will not help other people with the same issue ... but will just create confusion )

7
  • You can see the status in the column message of table cron_schedule in the database.
    – Abbas
    Jun 21, 2017 at 3:11
  • Try this magento extension github.com/AOEpeople/Aoe_Scheduler. It allows to manage cron jobs. Jun 21, 2017 at 4:53
  • Is this an indexing job? If so, is it possible it being restarted when already running, resulting in a never ending reindex? In my experience, it's either a job that calls exit() preventing other jobs to run (yes, I've seen this in extensions) or jobs that overlap and use temporary tables, overwriting work already in progress.
    – user4351
    Jun 21, 2017 at 7:50
  • @Abbas came on, really ?
    – Fra
    Jun 21, 2017 at 10:38
  • @NicholasMiller I know that extension, is it is not helpful here ... thx
    – Fra
    Jun 21, 2017 at 10:39

3 Answers 3

0

All of the fields should speak for themselves.

Copy and save the following PHP script.

<?php

    // Parse magento's local.xml to get db info, if local.xml is found

    if (file_exists('app/etc/local.xml')) {

    $xml = simplexml_load_file('app/etc/local.xml');

    $tblprefix = $xml->global->resources->db->table_prefix;
    $dbhost = $xml->global->resources->default_setup->connection->host;
    $dbuser = $xml->global->resources->default_setup->connection->username;
    $dbpass = $xml->global->resources->default_setup->connection->password;
    $dbname = $xml->global->resources->default_setup->connection->dbname;

    }

    else {
        exit('Failed to open app/etc/local.xml');
    }

    // DB Interaction
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to <a class="HelpLink" onclick="showHelpTip(event, hint_id_7); return false;" href="javascript:void(0)">mysql</a>');
    mysql_select_db($dbname);

    $result = mysql_query("SELECT * FROM " . $tblprefix . "cron_schedule") or die (mysql_error());


    // CSS for NexStyle
    echo '
    <html>
    <head>
    <title=Magento Cron <span style='background-color:#CCFF00;'>Status</span>>
    <style type="text/css">
    html {
        width: 100%;
        font-family: Helvetica, Arial, sans-serif;
    }
    body {
        background-color:#00AEEF;
        color:#FFFFFF;
        line-height:1.0em;
        font-size: 125%;
    }
    b {
        color: #FFFFFF;
    }
    table{
        border-spacing: 1px;
        border-collapse: collapse;
        width: 300px;
    }
    th {
        text-align: center;
        font-size: 125%;
        font-weight: bold;
        padding: 5px;
        border: 2px solid #FFFFFF;
        background: #00AEEF;
        color: #FFFFFF;
    }
    td {
        text-align: left;
        padding: 4px;
        border: 2px solid #FFFFFF;
        color: #FFFFFF;
        background: #666;
    }
    </style>
    </head>';

    // DB info for user to see
    echo '
    <body>
    <a href="http://nexcess.net">
    <img src="https://smhttp-nex.nexcesscdn.net/803313/static/images/logoMainR2.gif" width="217" height="38" alt="Nexcess Beyond Hosting"></a>



    <b>Table Prefix:</b> ' . $tblprefix . ''
    . '<b>DB Host:</b> ' . $dbhost . ''
    . '<b>DB User:</b> ' . $dbuser . ''
    . '<b>DB Name</b>: ' . $dbname . '</p>';

    // Set up <span style="background-color:#CCFF00;">the</span> table
    echo "
            <table border='1'>
            <thread>
            <tr>
            <th>schedule_id</th>
               <th>job_code</th>
               <th><span style="background-color:#CCFF00;">status</span></th>
               <th>messages</th>
               <th>created_at</th>
               <th>scheduled_at</th>
               <th>executed_at</th>
               <th>finished_at</th>
               </tr>
               </thread>
               <tbody>";

    // Display <span style="background-color:#CCFF00;">the</span> data from <span style="background-color:#CCFF00;">the</span> query
    while ($row = mysql_fetch_array($result)) {
               echo "<tr>";
               echo "<td>" . $row['schedule_id'] . "</td>";
               echo "<td>" . $row['job_code'] . "</td>";
               echo "<td>" . $row['<span style="background-color:#CCFF00;">status</span>'] . "</td>";
               echo "<td>" . $row['messages'] . "</td>";
               echo "<td>" . $row['created_at'] . "</td>";
               echo "<td>" . $row['scheduled_at'] . "</td>";
               echo "<td>" . $row['executed_at'] . "</td>";
               echo "<td>" . $row['finished_at'] . "</td>";
               echo "</tr>";
    }

    // Close table and last few tags
    echo "</tbody></table></body></html>";

    mysql_close($conn);
    ?>
2
  • 1
    I can open phpmyadmin if i need to check the cron, this is not the point.
    – Fra
    Jun 21, 2017 at 4:47
  • Also when you provide an answer you should give a little of information, if the question is not clear you can always point it out
    – Fra
    Jun 21, 2017 at 4:48
0

I'm sharing my approach because it looks there is nothing better right now:

  1. Disable the system cron for magento
  2. now you can call the cron manually:

    php cron.php -mdefault

Calling the cron from cli should give more info in case of errors not captured by magento.

if you want to test a precise cronjob you may want to temporary alter Mage_Cron_Model_Observer::_generateJobsin order to force this job to always be schedule.

Here an example to force catalog_product_alert

 protected function _generateJobs($jobs, $exists)
{
    $scheduleAheadFor = Mage::getStoreConfig(self::XML_PATH_SCHEDULE_AHEAD_FOR)*60;
        $schedule = Mage::getModel('cron/schedule');

        foreach ($jobs as $jobCode => $jobConfig) {

            $cronExpr = null;
            if ($jobConfig->schedule->config_path) {
                $cronExpr = Mage::getStoreConfig((string)$jobConfig->schedule->config_path);
            }
            if (empty($cronExpr) && $jobConfig->schedule->cron_expr) {
                $cronExpr = (string)$jobConfig->schedule->cron_expr;
            }
            if (!$cronExpr || $cronExpr == 'always') {
                continue;
            }
            // this force catalog_product_alert to be schedule always
            if ($jobCode == 'catalog_product_alert') {
                $cronExpr='*/1 * * * *';
            }
4
  • 1
    If you want a specific cron, you can use this one: github.com/netz98/n98-magerun#run-cronjob Jun 21, 2017 at 7:33
  • I will look into n98-magerun but I have some doubt it will be helpful for debugging purposes ..
    – Fra
    Jun 21, 2017 at 10:42
  • Don't doubt that for a minute. It's extremely useful, once you know your way around.
    – user4351
    Jun 21, 2017 at 10:44
  • At least you don't have to temporarily edit the core to run a specific cron job ;) Also, it has some other useful functions Jun 21, 2017 at 10:44
0

Some basic steps for debugging cron jobs:

  1. Check all your logs (mysql, apache, magento, cron, php, etc..). Look for any errors related to the code that should be running (check timestamps against the expected cron execution time, look for any irregularities).

  2. Follow the instruction here to download the utility. https://github.com/netz98/n98-magerun (TLDR; wget https://files.magerun.net/n98-magerun.phar)

  3. Gather your cron job code. ./n98-magerun.phar sys:cron:list

  4. Trigger your cron job manually ./n98-magerun.phar sys:cron:run cron_job_code

  5. Debug output if cron job runs unsuccessfully

    5A. Add debugging code (logging calls, etc) and manually trigger to determine where in the call stack your code is failing/terminating.

Depending on why its failing you could then assess whether its possible to create a log entry.

Potential configuration related causes of single cron task failure:

  • MySQL Server Has Gone Away

  • PHP Max Execution time reached

  • PHP Memory Limit Exceeded

n98-magerun sys command documentation http://n98-magerun.readthedocs.io/en/latest/commands/sys.html

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.