1. Чтобы не получить бан прочти правила магентоман! Читать обязательно!

Magento Cron Job Monitor

Тема в разделе "Magento", создана пользователем donvictorio, 4 июн 2013.

Модераторы: Violent
  1. donvictorio

    donvictorio

    Регистр.:
    28 янв 2010
    Сообщения:
    877
    Симпатии:
    808
    нарыл интересный скрипт, показывает в удобочитаемом виде информацию по заданиям крон, вытягивая её из базы.
    запускается из каталога на уровень выше от корневого , чтобы удобно было его запаролить (можно поправить пути и запускать его откуда угодно)

    крон можно запускать как файлом Перейти по ссылке из браузера, так и из консоли файлом cron.sh. последний вариант удобнее для добавления в расписание crontab:
    Код:
    crontab -e
    i
    * * * * * /path-to-cron.sh
    Enter (после строки с заданием должна быть пустая строка)
    Esc
    :wq
    
    код скрипта - создать php файл со следующим содержанием и запустить в браузере:
    PHP:
    <?php
    //Magento Cron Job Monitor. GNU/GPL
    //oliver.higgins@gmail.com
    //provided without warranty or support
    //
    //modifications by chiefair to retrieve Magento connection and database
    //info, display time, connection info and all job execution states
    //================================================================
     
    /** Get current date, time, UTC and offset **/
    $date  date("Y-m-d");
    $time  date("H:i:s T");
    $offset date("P");
    $utc    gmdate("H:i:s");
     
    /** Mage locations **/
    $mageconf '../app/etc/local.xml';  // Mage local.xml config
    $mageapp  '../app/Mage.php';      // Mage app location
     
    /*******************
    * Let George do it
    * Get connection information from Magento's local.xml file
    *******************/
     
    if (file_exists($mageconf)) {
     
    $xml simplexml_load_file('../app/etc/local.xml'NULLLIBXML_NOCDATA);
     
    $db['host'] = $xml->global->resources->default_setup->connection->host;
    $db['name'] = $xml->global->resources->default_setup->connection->dbname;
    $db['user'] = $xml->global->resources->default_setup->connection->username;
    $db['pass'] = $xml->global->resources->default_setup->connection->password;
    $db['pref'] = $xml->global->resources->db->table_prefix;
     
    $tblname$db['pref'] . "cron_schedule";
     
    }
     
    else {
        exit(
    'Failed to open ../app/etc/local.xml');
    }
     
    /* Initialize profile to be run as Magento Admin and log start of export */
     
    require_once $mageapp;
    umask(0);
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
     
    $storetimestamp Mage::getModel('core/date')->timestamp(time());
     
    $storetime date("H:i:s",$storetimestamp);
     
    /************************
    * Start HTML output
    ************************/
     
    echo '<html><head><title>Magento Cron Schedule on ' $date ' ' $time '</title>
    <meta http-equiv="refresh" content="60">
    <style type="text/css">html {width: 100%; font-family:  Arial,Helvetica, sans-serif;}
    body {line-height:1.0em; font-size: 100%;}
    table {border-spacing: 1px; width: 100%;}
    th.stattitle {text-align: left; font-size: 100%; font-weight: bold; color: white; background-color: #101010;}
    th {text-align: center; font-size: 80%; font-weight: bold; padding: 5px; border-bottom: 1px solid black; border-left: 1px solid black; }
    td {text-align: left; font-size: 80%; padding: 4px; border-bottom: 1px solid black; border-left: 1px solid black;}
    </style>
    </head><body>'
    ;
     
    /** Output title, connection info and cron job monitor runtime **/
     
    echo "<h2>Magento Cron Schedule Report</h2><h3>Connection: ".$db['user']."@".$db['host']."&nbsp;&nbsp;&ndash;&nbsp;&nbsp;Database: " $db['name'] . "&nbsp;&nbsp;&ndash;&nbsp;&nbsp;Table: " $tblname "</h3>";
    echo 
    "<h4>Runtime: " $date "&nbsp;&nbsp;&nbsp;Server: " .$time "&nbsp;&nbsp;&nbsp;Store: " .$storetime "&nbsp;&nbsp;&nbsp;Zulu: " $utc " UTC</h4>";
    echo 
    "<h4>Note: All logged times are UTC, your server timezone offset is " $offset " hours from UTC</h4>";
     
    /** Connect to database **/
     
    $conn mysql_connect($db['host'],$db['user'],$db['pass']);
    @
    mysql_select_db($db['name']) or die(mysql_error());
     
    //================================================================
    //Pending jobs
     
    $query='SELECT * FROM ' $tblname ' WHERE status ="pending" ORDER BY scheduled_at DESC' ;
    $result=mysql_query($query);
    $num=mysql_numrows($result);
    echo 
    '<table><tbody><tr><th class="stattitle" colspan="5">Jobs Pending: ' $num '</th></tr>';
    echo 
    "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
    $i=0;
    while (
    $i $num) {
     
    $schedule_id=mysql_result ($result,$i,"schedule_id");                               
    $job_code=  mysql_result($result,$i,"job_code");
    $status=mysql_result ($result,$i,"status");
    $created_at=mysql_result ($result,$i,"created_at");
    $scheduled_at=mysql_result ($result,$i,"scheduled_at");
    $executed_at=mysql_result ($result,$i,"executed_at");
    $finished_at=mysql_result ($result,$i,"finished_at");
     
    //output html
    echo "<tr>";
    echo 
    "<td>".$schedule_id."</td>";
    echo 
    '<td>'.$job_code."</td>";
    echo 
    '<td style="color: red;">'.$status."</td>";
    echo 
    "<td>".$created_at."</td>";
    echo 
    "<td>".$scheduled_at."</td>";
    echo 
    "</tr>";         
    $i++;
    }
    echo 
    "</tbody></table><hr>";
     
    //================================================================
    //Running jobs
     
    $query='SELECT * FROM ' $tblname ' WHERE status ="running" ORDER BY executed_at DESC' ;
    $result=mysql_query($query);
    $num=mysql_numrows($result);
    echo 
    '<table><tbody><th class="stattitle" colspan="7">Jobs Running: ' $num '</th></tr>';
    echo 
    "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
    echo 
    "<th>Executed At</th><th>Finished At</th></tr>";
    $i=0;
    while (
    $i $num) {
     
    $schedule_id=mysql_result ($result,$i,"schedule_id");                               
    $job_code=  mysql_result($result,$i,"job_code");
    $status=mysql_result ($result,$i,"status");
    $created_at=mysql_result ($result,$i,"created_at");
    $scheduled_at=mysql_result ($result,$i,"scheduled_at");
    $executed_at=mysql_result ($result,$i,"executed_at");
    $finished_at=mysql_result ($result,$i,"finished_at");
     
    //output html
    echo "<tr>";
    echo 
    "<td>".$schedule_id."</td>";
    echo 
    "<td>".$job_code."</td>";
    echo 
    "<td>".$status."</td>";
    echo 
    "<td>".$created_at."</td>";
    echo 
    "<td>".$scheduled_at."</td>";
    echo 
    "<td>".$executed_at."</td>";
    echo 
    "<td>".$finished_at."</td>";
    echo 
    "</tr>";         
    $i++;
    }
    echo 
    "</tbody>";
     
    //================================================================
    //Succsessful jobs
     
    $query='SELECT * FROM ' $tblname ' WHERE status ="success" ORDER BY executed_at DESC' ;
    $result=mysql_query($query);
    $num=mysql_numrows($result);
    echo 
    '<tbody><tr><th class="stattitle" colspan="7">Jobs Successful: ' $num '</th></tr>';
    echo 
    "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
    echo 
    "<th>Executed At</th><th>Finished At</th></tr>";
    $i=0;
    while (
    $i $num) {
     
    $schedule_id=mysql_result ($result,$i,"schedule_id");                               
    $job_code=  mysql_result($result,$i,"job_code");
    $status=mysql_result ($result,$i,"status");
    $created_at=mysql_result ($result,$i,"created_at");
    $scheduled_at=mysql_result ($result,$i,"scheduled_at");
    $executed_at=mysql_result ($result,$i,"executed_at");
    $finished_at=mysql_result ($result,$i,"finished_at");
     
    //output html
    echo "<tr>";
    echo 
    "<td>".$schedule_id."</td>";
    echo 
    "<td>".$job_code."</td>";
    echo 
    "<td>".$status."</td>";
    echo 
    "<td>".$created_at."</td>";
    echo 
    "<td>".$scheduled_at."</td>";
    echo 
    "<td>".$executed_at."</td>";
    echo 
    "<td>".$finished_at."</td>";
    echo 
    "</tr>";         
    $i++;
    }
    echo 
    "</tbody>";
     
    //================================================================
    //Missed jobs
     
    $query='SELECT * FROM ' $tblname ' WHERE status ="missed" ORDER BY executed_at DESC' ;
    $result=mysql_query($query);
    $num=mysql_numrows($result);
    echo 
    '<tbody><tr><th class="stattitle" colspan="7">Jobs Missed: ' $num '</th></tr>';
    echo 
    "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
    echo 
    "<th>Executed At</th><th>Finished At</th></tr>";
    $i=0;
    while (
    $i $num) {
     
    $schedule_id=mysql_result ($result,$i,"schedule_id");                               
    $job_code=  mysql_result($result,$i,"job_code");
    $status=mysql_result ($result,$i,"status");
    $created_at=mysql_result ($result,$i,"created_at");
    $scheduled_at=mysql_result ($result,$i,"scheduled_at");
    $executed_at=mysql_result ($result,$i,"executed_at");
    $finished_at=mysql_result ($result,$i,"finished_at");
     
    //output html
    echo "<tr>";
    echo 
    "<td>".$schedule_id."</td>";
    echo 
    "<td>".$job_code."</td>";
    echo 
    "<td>".$status."</td>";
    echo 
    "<td>".$created_at."</td>";
    echo 
    "<td>".$scheduled_at."</td>";
    echo 
    "<td>".$executed_at."</td>";
    echo 
    "<td>".$finished_at."</td>";
    echo 
    "</tr>";         
    $i++;
    }
    echo 
    "</tbody>";
     
    //================================================================
    //Failed jobs
     
    $query='SELECT * FROM ' $tblname ' WHERE status ="error" ORDER BY executed_at DESC' ;
    $result=mysql_query($query);
    $num=mysql_numrows($result);
    echo 
    '<tbody><tr><th class="stattitle" colspan="7">Jobs Failed: ' $num '</th></tr>';
    echo 
    "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
    echo 
    "<th>Executed At</th><th>Finished At</th></tr>";
    $i=0;
    while (
    $i $num) {
     
    $schedule_id=mysql_result ($result,$i,"schedule_id");                               
    $job_code=  mysql_result($result,$i,"job_code");
    $status=mysql_result ($result,$i,"status");
    $created_at=mysql_result ($result,$i,"created_at");
    $scheduled_at=mysql_result ($result,$i,"scheduled_at");
    $executed_at=mysql_result ($result,$i,"executed_at");
    $finished_at=mysql_result ($result,$i,"finished_at");
     
    //output html
    echo "<tr>";
    echo 
    "<td>".$schedule_id."</td>";
    echo 
    "<td>".$job_code."</td>";
    echo 
    "<td>".$status."</td>";
    echo 
    "<td>".$created_at."</td>";
    echo 
    "<td>".$scheduled_at."</td>";
    echo 
    "<td>".$executed_at."</td>";
    echo 
    "<td>".$finished_at."</td>";
    echo 
    "</tr>";         
    $i++;
    }
    echo 
    "</tbody></table></body></html>";
     
    //================================================================
    // End of report
     
    mysql_close($conn);
    ?>

    для того, чтобы в логах /var/log/system.log отображалась запись о том, что крон был запущен, нужно в файле cron.php в самом конце в блоке

    PHP:
    try {
        
    Mage::getConfig()->init()->loadEventObservers('crontab');
        
    Mage::app()->addEventArea('crontab');
        
    Mage::dispatchEvent('default');
        
    Mage::log("Cron run"); //Добавить строку, чтобы крон логировался
    } catch (Exception $e) {
        
    Mage::printException($e);
    }
    добавить строчку Mage::log("Cron run");

    запись в логе будет выглядеть так:

    Код:
    2013-06-03T22:39:49+00:00 DEBUG (7): Cron run

    удобный модуль для настройки крона
    Перейти по ссылке
     
    s.kiev, vertex08 и Шумадан нравится это.
  2. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    ps2chiper и Шумадан нравится это.
  3. donvictorio

    donvictorio

    Регистр.:
    28 янв 2010
    Сообщения:
    877
    Симпатии:
    808
    поюзал пару дней на 1.8.1
    что понравилось: таймлайн - отображение в виде линейки и на ней частота выполняемых заданий.
    возможность просто включить и выключить задание.

    что не понравилось: невозможность изменить время выполнения задания. в целом глючный, в логах куча ошибок и рандомно пропускал задания по неизвестным причинам (сайт полностью статичен, даже посетителей нету)
     
  4. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    Hmm, я его использовал на 1.6 (кстати на странице нет совместимости с 1.8) и в свое время он был пассивным (т.е. использовался для того чтобы отслеживать кроны а не изменять их).

    Возможно большинство проблем от 1.8, хотя хз :)
     
  5. Shotty

    Shotty Создатель

    Регистр.:
    12 авг 2011
    Сообщения:
    30
    Симпатии:
    16
    Noovias Cronjobs - пользуюсь, удобный очень, по лучше других будет, в 1.9.0.1 нормально работает.
     
  6. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    136
    скрипт конечно ничего, но использовать такие скрипты на живых серверах крайне нежелательно, лучше
    использовать готовые расширения, они и функциональнее и безопаснее.
    по поводу расширений могу порекомендовать
    Перейти по ссылке
    он конечно попроще гораздо чем AOE, но самое необходимое есть и не загаживает логи.
     
  7. ESq

    ESq Создатель

    Регистр.:
    13 сен 2012
    Сообщения:
    49
    Симпатии:
    94
    У меня был очень негативный опыт использования данного модуля. Постоянные ошибки, тысячи писем в почте с ошибкой, что путь для логов Watchdog отстутствует и т.п. Разработчики отвечают, что основная проблема в том, что проектом они занимаются только по субботам, и только в свободное время. Никакой поддержки нет, пишите замечания, потом когда-нибудь поправим.

    С учетом того, что многие прямо рекомендуют установку этого скрипта, следует предположить, что у них все работает замечательно. Возможно влияет версия установленной Magento. У меня была 1.9.1.0

    И еще один важный момент. По ссылке на Connect лежит версия 0.3.2. В соседней же ветке имеется последняя версия 1.2.1.
    От себя замечу - у меня проблемы были с обеими версиями.
     
    Последнее редактирование модератором: 22 сен 2015